2010-01-20 6 views
8

linq 쿼리에 문제가 있습니다. 전에도 이와 비슷한 방법을 사용했지만 지금은 무엇이 잘못 될지 이해할 수 없습니다.linq query where int ID가 List에 속함 <int>

오류

일부 잘못된 인수를
인수 '1'이 'System.Collections.Generic.List.Contains (INT)'에 가장 적합한 오버로드 된 메서드 일치 '에서 변환 할 수 없습니다를 int? ' ~ 'int'; rTestResults의 WHERE 절을 참조

코드 :

List<int> rMTCPlates = (from rP in mDataContext.Plates 
         where rP.SOItem.SONumberID == aSONumber 
         select rP.ID).ToList(); 

var rTestResults = from rT in mDataContext.TestSamplesViews 
        where rMTCPlates.Contains(rT.PlateID) 
        select rT; 

어떤 생각 세드릭?

어떤 도움 감사,
감사

컬렉션에있는 항목이없는 상태에서 ID 필드, Null을 허용하기 때문이다

답변

21

당신은 여기 null-coalescing operator를 사용할 수 있습니다

var rTestResults = from rT in mDataContext.TestSamplesViews 
       where rMTCPlates.Contains(rT.PlateID ?? 0) 
       select rT; 
+0

또한 rT.PlateID을 사용할 수

당신은 단지 easyquick 수정을 원하는 및/또는 PlateID을 변경하지 못할 경우

은 그래서 처음에 값이 있는지 확인할 수 있고, 더 이상 널 입력이 가능하지 않습니다 .GetValueOrDefault(). null 일 경우 유형에 대한 기본값을 사용합니다. – JonC

+0

+1 나를 가르치기위한 새로운 오늘 ... 그냥 사용 :) – Modika

6

.

아마도 데이터베이스에 not-null이라고 표시하는 것을 잊어 버렸기 때문에 디자이너가 이렇게 생성했습니다.

DB의 가장 좋은 점은 null이 아니며 데이터를 새로 고칩니다.

게다가, U는이 확장 방법은 엔티티에 SQL 또는 Linq는 Linq에 작동이 들어 나는 확실하지 않다, 당신은 DB를 LINQ 가정, 당신이 사용중인 LINQ 지정하지 않은, 당신도 후 다른 NotSupportedException이를 얻을 수 있습니다 위의 사항을 수정하십시오.

따라서 DB에 액세스하는 첫 번째 쿼리와로드 된 컬렉션에서 값을 검색하는 두 번째 쿼리를 사용하거나 'Contains()' workaround using Linq to Entities?을 사용해보십시오.

그리고 당신은 LINQ - 투 객체를 사용하고 모든 쓰레기는 위의 말했다에 대해 걱정하지 않는 경우, 바로 다음 사용

var rTestResults = from rT in mDataContext.TestSamplesViews 
        where rT.PlateID.HasValue && 
         rMTCPlates.Contains(rT.PlateID.Value) 
        select rT.Value; 
2

System.Collections.Generic.List.Contains(int)의 예외가 있으므로 mDataContext.TestSamplesViews.PlateID이 Null을 허용한다고 추측 할 수 있습니다.

var rTestResults = from rT in mDataContext.TestSamplesViews 
        where (rT.PlateID.HasValue && rMTCPlates.Contains(rT.PlateID)) 
        select rT;