2012-05-07 4 views
0
 var query1 = from l in context.Logs 
        where l.LogID == maxid 
        select l; 
     int count1 = query1.Count(); 

     var query2 = from ld in context.LogDetails 
        where ld.LogID == maxid 
        select ld; 
     int count2 = query2.Count(); 

     Assert.AreEqual(1,count1); 
     Assert.AreEqual(0,count2); 

더 나은 방법으로 위의 쿼리를 작성할 수 있으면 좋겠습니다. TSQL을 사용하는 경우 OUTER JOIN을 사용하여 필터를 사용하여 ld.LogID가 null인지 확인할 수 있습니다. 그러나 나는 LINQ에서 그렇게하는 법을 모른다. 이걸 정리할 방법이 있을까요?Linq 외부 조인 가능 문제

도와 주셔서 감사합니다.

+0

[방법 : 왼쪽 외부 조인 수행 (C# 프로그래밍 가이드)] (http://msdn.microsoft.com/en-us/library/bb397895.aspx) 원하는 것을 찾았습니까? – dtb

답변

3

Outer joins are possible in LINQ.

var query = from log in context.Logs 
      join logDetail in context.LogDetails 
       on log.LogID = logDetail.LogID into lj 
      from item in lj.DefaultIfEmpty() 
      select new { log.LogID, MissingDetails = lj == null }; 
+0

그래서 Log 테이블의 레코드 1 개와 logDetails의 레코드 0 개만 확인하기 위해 한 줄에 Assert를 작성할 수 있습니까? 저에게 알려주세요. –

0

다음은 탐색 속성을 사용하여 외부 조인의 :

from log in context.Logs 
from logDetail in log.LogDetails.DefaultIfEmpty() 
select new {log, logDetail} 

것은 널 위해 logdetail 테스트하는 것을 잊지 마십시오.

+0

David, Logs 및 LogDetails를 결합해서는 안되는 방법은 무엇입니까? –

+0

David,이 쿼리는 컴파일되지 않습니다. –

+0

dbml을 엽니 다. 적절한 ID를 사용하여 LogDetail에 Log에서 연관을 추가하십시오. 이제 dbml은 각 클래스에 탐색 속성을 생성합니다 : Log.LogDetails 및 LogDetail.Log –