2014-07-10 2 views
4

나는 (내 이해에 따라) 예외를 throw해야하는 linq 쿼리를 실행하고 있지만 그렇지 않습니다. 쿼리 매개 변수에 맞는 데이터베이스 항목이 없습니다.. 빈 컬렉션에 대한 예외를 처음 throw하지 않습니다.

하는 예외를 throw하지 않습니다 다음, 단순히 null을 반환 :

from i in Items 
where i.ItemID == 25 
select i.Values.First(v => v.AttribID == 69) 

예상대로 예외가 던져 않습니다 다음 쿼리의 여러 가지 형태의 테스트를 통해

(from i in Values 
where i.ItemID == 25 
where i.AttribID == 69 
select i).First() 

을의 내가 발견 할 수있는 유일한 차이점은. 첫 번째는 람다식이 아무것도 반환하지 않을 때 예외를 던지지 않는 것 같지만 .First가 매개 변수없이 호출 될 때 예외가 발생합니다. 이유를 이해하도록 도와주세요.

명확히하기 위해 ...

from i in Items 
where i.ItemID == 25 
select i 

... 1 개 항목을 반환합니다.

참조 linqPad는 이러한 쿼리를 테스트 할 때 아래 결과 :

enter image description here

enter image description here

enter image description here

+1

첫 번째 쿼리는 확실히 null을 반환하지 않습니다. 빈 콜렉션을 리턴 할 수도 있지만, 그것은 같은 것이 아닙니다. –

+0

null과 동일한 1 개의 항목을 반환합니다. – MatthewHagemann

+0

오케이. 이런 종류의 일에 대해 아주 분명히해야합니다. 다음으로, LINQ to Objects, LINQ to SQL, EF, 다른 것입니까? 문제를 보여주는 짧지 만 완전한 프로그램이 정말 유용 할 것입니다. –

답변

9

첫 번째 쿼리는 말한다 :

필터 ItemsItemId == 25을 포함하고 각각 필터링 결과 i 인 경우에만 vi.Values v.AttribID == 69 안에 첫 번째 항목을 선택하십시오.

여기 First은 예를 들어. Items은 "각 필터링 된 결과에서 i"이 정확히 0 인 항목을 처리하므로 First이 호출되지 않습니다.

두 번째 쿼리는 말한다 : 단지에

필터 ValuesItemId == 25AttribId == 69 나에게 첫 번째 일치 항목을주고있는 사람을 포함한다.

일치하는 항목이없는 경우이 경우 분명합니다. First은 의미있는 결과를 줄 수 없으며 던질 것입니다.

+0

위의 편집을 참조하십시오. 첫 번째 항목은 1 개의 항목을 반환합니다. – MatthewHagemann

+0

@MatthewHagemann 그것은'AttribID'가 69가 아닌 하나의 아이템을 반환합니다. 따라서 두 번째 쿼리의 결과는 빈 시퀀스입니다.이 시퀀스에서 첫 번째 요소를 얻으려고하면 오류가 발생할 것으로 예상됩니다. 코드를 디버그하면이 단일 항목에 대해 'AttribID'가 69가 아님을 알 수 있습니다. 그러나 두 번째 쿼리에서 이미 Jon이 지적했듯이 'ItemId == 25' ** 및 ** AttribId == 69'가 존재하지 않습니다. – Christos

+0

@Jon 정말 이상하지만 그렇지 않습니다. 나는 너와 같이 대답 할 준비가되었지만 szample과 omg를 만들었다. 여기를보세요. https://dotnetfiddle.net/qZglHX – Baximilian

관련 문제