如何编写此linq查询?

时间:2018-08-28 21:22:31

标签: c# linq

我有完全可以正常工作的这段代码。但是我想了解如何将其编写为单个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});
        }

2 个答案:

答案 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实例,以计算满足您对该名称标准的记录数。