我有完全可以正常工作的这段代码。但是我想了解如何将其编写为单个linq查询而不是ling查询,以及包含另一个重复查询的for循环。
这个想法是,我正在查看人们尚未完成工作的课程数据库。在第一个查询中,我在数据库中找到了所有唯一的人。然后,在for循环的第二个查询中,我遍历第一个查询中的所有名称,并计算它们还有多少类需要完成。
同样,代码有效,我只是想知道将其整合为一个查询的最佳方法。
var ListOfNames = (from record in records select record.LastName).Distinct();
foreach (var NameOfPerson in ListOfNames)
{
Console.WriteLine(NameOfPerson);
var NotCompletedCount = (from rec in records
where rec.LastName == NameOfPerson
&& rec.AssignmentType == "MANDATORY"
&& string.IsNullOrEmpty(rec.CompleteDate) == true
select rec).Count();
Console.WriteLine(NotCompletedCount);
rankList.Add(new Rank{ LastName = NameOfPerson, RankCount = NotCompletedCount});
}
答案 0 :(得分:1)
我不确定以前的答案是否与此有所不同。在这种情况下,我们首先过滤数据,然后按名称分组和选择等级实例。我认为,.Net结果将优化并向数据库进行相同的查询。
var result = records.Where(x => x.AssigmentType == "MANDATORY" &&
string.IsNullOrEmpty(x.CompleteDate))
.GroupBy(x => x.LastName)
.Select(group => new Rank {LastName = group.Key, RankCount = group.Count()});
有关GroupBy工作原理的更多详细信息,请参见:LINQ with groupby and count
答案 1 :(得分:0)
据我了解,您的工作基本上是针对每个姓氏,获取满足某种条件的记录数。 GroupBy
可以在这里使用:
var rankList = records.GroupBy(r => r.LastName)
.Select(g => new Rank {
LastName = g.Key,
RankCount = g.Count(x => x.AssignmentType == "MANDATORY" && string.IsNullOrEmpty(x.CompleteDate))).ToList()
对不起,格式化很糟糕,因为Count
调用太长了。
这将foreach
循环和第一个查询结合在一起。它按LastName
对记录进行分组,为每个名称创建一个Rank
实例,以计算满足您对该名称标准的记录数。