gpt4 book ai didi

c# - LINQ 多对多计数分组

转载 作者:行者123 更新时间:2023-11-30 17:36:02 26 4
gpt4 key购买 nike

我有 2 个实体,具有一对多的关系,我打算将其切换为多对多,但我需要分组和计数方面的帮助。

SearchString -> 许多 JobResults

SearchSting 用于查找作业结果,作业结果存储为 SearchString 的集合属性:

public class SearchString
{
public int SearchStringId { get; set; }
public string SearchStringName { get; set; }
public string query { get; set; }
public JobFunction JobFunction { get; set; }
public JobSeniority JobSeniority { get; set; }
public virtual ICollection<JobSearchResult> results { get; set; }
}
public class JobSearchResult
{
public int JobSearchResultId { get; set; }
public string jobtitle { get; set; }
public string company { get; set; }
public virtual SearchString SearchString { get; set; }
}

我得到所有工作结果的前 5 个 JobFunctions,如下所示:

var top5jobfunctions = JobSearchResults.Where(a => (a.SearchString != null)).
GroupBy(s => new { s.SearchString.JobFunction.JobFunctionId, s.SearchString.JobFunction.JobFunctionName }).
Select(g => new { value = g.Key.JobFunctionId, displayname = g.Key.JobFunctionName, count = g.Count() }).
OrderByDescending(x => x.count).
Take(5).ToList();

我打算将其切换为多对多:

public class SearchString
{
public int SearchStringId { get; set; }
public string SearchStringName { get; set; }
public string query { get; set; }
public JobFunction JobFunction { get; set; }
public JobSeniority JobSeniority { get; set; }
public virtual ICollection<JobSearchResult> results { get; set; }
}
public class JobSearchResult
{
public int JobSearchResultId { get; set; }
public string jobtitle { get; set; }
public string company { get; set; }
public virtual ICollection<SearchString> SearchStrings { get; set; }
}

一旦我将其切换为多对多,如何获得我的前 5 个工作职能计数?

此外,我选择的结构是否正确?例如,我想知道让 jobresults 成为 SearchString 的子集合是否不是最好的方法,也许我应该让 SearchStrings 成为 JobResult 的集合属性。

最佳答案

对于具有许多关系的修改模型,请考虑对原始查询进行以下修改:

var top5jobfunctions = 
JobSearchResults.SelectMany(j => j.SearchString.Select(s => new {j,s}))
.Where(j => (j.s != null))
.GroupBy(j => new { j.s.JobFunction.JobFunctionId, j.s.JobFunction.JobFunctionName })
.Select(g => new { value = g.Key.JobFunctionId, displayname = g.Key.JobFunctionName, count = g.Count() })
.OrderByDescending(x => x.count)
.Take(5).ToList();

解释:

  • 现在自 JobSearchResult包含 ICollection<SearchString> ,它需要展平以执行与之前类似的查询
  • SelectMany展平数据并将结果填充为匿名类型,其中包含每个 SearchString 的记录
  • 此后将遵循您设计的类似逻辑

模型正确性

  • 我不喜欢这种关系,因为它使整体查询和数据插入变得不必要地复杂

  • 根据我的理解,一对多关系在获取所有相关信息方面同样出色,在这种情况下,您可以考虑只使用 ICollection<JobSearchResult>。聚集在里面SearchString或者反之亦然,基于适用性的关系,我不确定循环许多关系模型解决了什么样的用例。

关于c# - LINQ 多对多计数分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40326141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com