2010-12-21 2 views
3

SQL 쿼리를 LINQ 엔터티 쿼리로 변환하려고 시도했지만 LINQ 블록에 몇 가지 문제가 있습니다.다중 조인 - 다중 조인 - '선택'의 널 참조 예외

var pList = (from pending in pendingItems 
// JOIN 
from user in userList.Where(u => pending.UserID == u.UserID) 
// LEFT OUTER JOIN 
from fork in forkList.Where(f => pending.ID == f.PendingID) 
.DefaultIfEmpty() 
// LEFT OUTER JOIN 
from map in mapList.Where(m => fork.ID == m.ForkID) 
.DefaultIfEmpty() 
orderby pending.Date descending 
select new 
{ 
ItemID = pending.ID,     // Guid 
Description = pending.Description, // String 
Date = pending.Date,     // DateTime 
Status = fork.Status,    // Int32 (*ERROR HERE*) 
UserName = user.UserName,   // String 
MapID = map.ID      // Guid (*ERROR HERE*) 
}) 
.Distinct() 
.ToList(); 

LINQ 쿼리이 중 하나에 실패 : 나는 지금까지 그것을 가지고

다음
SELECT distinct(p.PendingID, 
     p.Description, 
     p.Date, 
     f.Status, 
     u.UserName, 
     m.MapID 
    FROM Pending p 
    JOIN Users u 
    ON p.UserID = u.UserID 
    LEFT JOIN Forks f 
    ON p.PendingID = f.PendingID 
    LEFT JOIN Maps m 
     ON f.ForkID = m.ForkID 
    ORDER BY p.Date DESC 

엔티티 쿼리에 LINQ입니다 : 여기

예상대로 수행하는 SQL 쿼리입니다 다음 두 줄은 왼쪽에서 검색된 값을 할당하려고 시도합니다. 외부 조인은입니다. 다음 줄을 생략하는 경우, LINQ 쿼리는 오류없이 완료 :
Status = fork.Status, 
MapID = map.ID 

가 왜 LINQ 쿼리의 선택 블록 내에서 실패하는 2 속성 할당입니까?

+0

데이터베이스의 EF 또는 메모리 내 팩시밀리에 대해 실제로이 작업을 수행하고 있습니까? 둘째,이 코드는 LINQPad에 있으며 생성 된 SQL을 확인할 수 있습니까? –

+0

저는 이것이 컴파일러 오류라고 생각합니다. 그래서 두 줄 모두에서 오류를 볼 수 있습니다. – tster

+1

tster : 게시물 제목에 "Null Reference Exception"이라고 표시되어 컴파일러 오류가 의심 스럽습니다. – Gabe

답변

1

외부 조인으로 인해 forkmap이 null 일 수 있습니다. 물론 그들이 null이면 해당 속성에 액세스 할 수 없습니다.

Status = (fork == null) ? null : fork.Status, 
MapID = (map == null) ? null : map.ID 
+0

DefaultIfEmpty는 컬렉션을 반환하기 때문에 null이 될 수 없으며 컬렉션이 없으면 싱글 톤 컬렉션을 반환합니다. 그러나 컬렉션의 값은 null 일 수 있습니다. – tster

+0

tster :'map'과'fork' 변수는'DefaultIfEmpty'에 의해 반환 된 값을 반복하여 실제로 null 일 수 있습니다. – Gabe

+0

Oh shoot, 나는 여러 개의 from 절 대신'let x = ... '를 보곤합니다. – tster