[英]How do I write this linq query?
我有完全可以正常工作的这段代码。 但是我想了解如何将其编写为单个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});
}
我不确定以前的答案是否与此有所不同。 在这种情况下,我们首先过滤数据,然后按名称分组和选择等级实例。 我认为,.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与groupby和count
据我了解,您的工作基本上是针对每个姓,获取满足某种条件的记录数。 可在此处使用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
实例,以计算满足您对该名称标准的记录数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.