LINQ to Entities - множественные объединения - исключение нулевой ссылки при выборе - PullRequest
3 голосов
/ 21 декабря 2010

Я пытаюсь преобразовать запрос SQL в запрос LINQ to entity, но у меня возникли некоторые проблемы с блоком LINQ select .

Вот SQL-запрос, который выполняется должным образом:

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 для сущностей, который у меня есть на данный момент:

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Сбой запроса в любой из следующих двух строк, которые пытаются присвоить значения, извлеченные из результатов left external join .Если следующие строки опущены, запрос LINQ завершается без ошибок:

Status = fork.Status,
MapID = map.ID

Почему эти 2 назначения свойств не выполняются в блоке выбора запроса LINQ?

1 Ответ

1 голос
/ 21 декабря 2010

Проблема в том, что из-за ваших внешних объединений fork и map могут быть нулевыми.Конечно, когда они нулевые, вы не можете получить доступ к их свойствам.Вам может понадобиться что-то вроде этого:

Status = (fork == null) ? null : fork.Status,
MapID = (map == null) ? null : map.ID 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...