这两个LINQ语句有什么区别?

时间:2010-04-21 13:24:38

标签: c# linq linq-to-sql

我的代码中有第1个语句,发现它没有给出准确的计数,当正确的答案是18时它返回1.要尝试调试问题我把它分解出去在这里创建第二个语句并且计数返回我只是看不出这两者之间的区别。看起来第一个更紧凑。

我目前正在连续运行这两个语句,我确信数据库在两者之间没有变化。

int count = (from s in surveysThisQuarter
             where s.FacilityID == facility.LocationID
             select s.Deficiencies).Count();

VS

 var tempSurveys = from s in surveysThisQuarter
                   where s.FacilityID == facility.LocationID
                   select s;
 int count = 0;
 foreach (Survey s in tempSurveys)
     count += s.Deficiencies.Count();

5 个答案:

答案 0 :(得分:7)

在第一个查询中,您选择了一堆“缺陷”并计算您有多少个整数。你想通过它的声音来总结它们:

int count = (from s in surveysThisQuarter
             where s.FacilityID == facility.LocationID
             select s.Deficiencies.Count()).Sum();

或(可能生成更好的SQL,谁知道)

int count = (from s in surveysThisQuarter
             where s.FacilityID == facility.LocationID
             from x in s.Deficiencies
             select x).Count();

答案 1 :(得分:4)

这是因为第二个片段是对缺陷计数的总结,而第一个是计算缺陷。
这与您的第二个代码段相同

int count = (from s in surveysThisQuarter 
             where s.FacilityID == facility.LocationID 
             select s.Deficiencies.Count()).Sum(); 

答案 2 :(得分:1)

第一种形式是计算匹配行的数量。您应该使用Sum扩展方法。

答案 3 :(得分:1)

第一个是在Count(或任何缺陷类型)上返回IEnumerable<Deficiencies>。结果与surveysThisQuarter.Count()相同。这是因为结果实际上是集合的集合。

第二个是计算所有缺陷 - 这可能是你想要的。

要正确完成第一项工作,您需要SelectMany而不是Select来平整您的收藏。

答案 4 :(得分:1)

我最好的猜测:

计数!=总和

您想要累计值.Count