2010-04-21 99 views
1

我有1ND声明在我的代码,发现它不给一个准确的数,它返回1时,正确答案是18。为了尝试和调试我打破了它在这里创造了第二个发言的问题,并计数返回18我只是看不出这两者之间有什么不同。看起来第一个更紧凑。这两个LINQ语句有什么区别?

我目前正在运行的这两条语句背靠背,我敢肯定,数据库没有在两者之间变化。

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(); 

回答

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(); 
+0

完美,谢谢。 – jamone 2010-04-21 13:32:13

4

那是因为第二代码段求和缺陷计数,而第一计数的缺陷。
这是相同的作为第二代码段

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

第一种形式计数匹配的行的数目。您应该改用Sum扩展方法。

1

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

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

对于第一次正常工作,您需要使用SelectMany而不是Select,以使您的收藏更加平整。

1

我最好的猜测:

计数= SUM

你想要的.Count累计值!?

+0

Hrmpf 1..0答案时,我写了这个,“你一个人”与后来的NoScript:6分相同的答案。 – 2010-04-21 13:29:47