Linq to Entities - Левое внешнее объединение с лямбда-выражением - PullRequest
0 голосов
/ 27 октября 2011

У меня есть этот запрос, и я не могу узнать, как это сделать в лямбда-выражении.

select * from NewsVersion nv
left outer join ChangeProcess cp on cp.DocumentId = nv.NewsId and cp.EndDate is null
where nv.NewsId = 'B2301B7F-D37E-4CF5-9392-01844564BFCC'

У кого-нибудь есть идея?

Спасибо

Ответы [ 3 ]

0 голосов
/ 27 октября 2011

Как насчет чего-то подобного ...

var query =
    from nv in NewsVersion
    from cp in ChangeProcess.DefaultIfEmpty()
    where nv.NewsId == cp.DocumentId && cp.EndDate == null && 
       nv.NewsId = "B2301B7F-D37E-4CF5-9392-01844564BFCC"
    select new { ... }
0 голосов
/ 27 октября 2011

Я не уверен на 100% и немного смущен тем, почему Томас Левеск считает, что это не равнозначно (в конце концов, NewsId == DocumentId - это сравнение на равенство), но я не понимаю, почему это не должно работать:

var query =
from nv in db.NewsVersion
join cp in db.ChangeProcess on nv.NewsId equals cp.DocumentId into joined
from j in joined.Where(x => x.EndDate == null).DefaultIfEmpty()
where nv.NewsId = "B2301B7F-D37E-4CF5-9392-01844564BFCC"
select new { NewsVersion = nv, ChangeProcess = j };

РЕДАКТИРОВАТЬ: исправлено, согласно комментарию ОП

0 голосов
/ 27 октября 2011

Поскольку это не эквиджоин, вы не можете использовать ключевое слово join, но вы все равно можете сделать это так:

var query =
    from nv in db.NewsVersion
    from cp in db.ChangeProcess.Where(c => nv.NewsId == cp.DocumentId && c.EndDate == null).DefaultIfEmpty()
    where nv.NewsId = "B2301B7F-D37E-4CF5-9392-01844564BFCC"
    select new { NewsVersion = nv, ChangeProcess = cp };
...