2010-04-21 1 views
1

내 코드에서 1 번째 성명서를 가지고 있고 정확한 수를 제공하지 못한다는 것을 알았습니다. 정답이 18 일 때 1을 반환했습니다. 문제를 디버깅하려면 여기에서 2 번째 명령문을 작성하고 18을 반환합니다. 나는이 둘의 차이점을 보지 못했다. 1 등이 조금 더 컴팩트 한 것처럼 보입니다.이 두 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(); 

또는

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

감사합니다. – jamone

4

한게 번째 조각은 처음에는 결함을 카운트하는 동안 결함이 카운트를 합산되기 때문이다.
이것은 두 번째 단편

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

제 형태 매칭 행의 수를 세고 동일하다. 대신 Sum 확장 방법을 사용해야합니다.

1

IEnumerable<Deficiencies>Count를 반환되는 첫 번째 (알고 더 나은 SQL을 생성 할 수 있음) (또는 무엇이든 유형 결핍은). 결과는 surveysThisQuarter.Count()과 같습니다. 이것은 결과가 실제로 콜렉션의 모음이기 때문입니다.

둘째로 모든 결함을 계산합니다. 이는 아마도 당신이 원하는 것일 것입니다.

첫 번째 작업을 올바르게 수행하려면 Select이 아닌 SelectMany이어야하며 컬렉션을 평평하게해야합니다.

1

내 추측 :

카운트 =

당신은 .Count의 누적 값을 원하는 합

!?

+0

Hrmpf .. 0은 내가 이것을 썼을 때, "당신은 인간입니까?"대 NoScript는 나중에 대답합니다 : 6 개의 동일한 대답. –

관련 문제