2010-10-20 4 views
0

Учитывая этот запрос LINQКак получить внешнее соединение в запросе Linq

from c in context.Customers 
from o in c.Orders 
where c.City == "MyCity" || o.ShipTo == "MyCity" 
select c 

запрос не возвращает ни одной строки, если город клиента является «MyCity», но не имеет каких-либо заказов. Это связано с предполагаемым внутренним соединением между Клиентами и Ордерами. Как выбрать клиентов с городом «MyCity» или заказать, отправленный в «MyCity

В этом случае мне нужно внешнее соединение между клиентами и заказами. Как это выразить в Linq? Я думаю, что приблизительный TSQL будет

select customers.* 
from customers 
left join orders on customers.id = orders.customerid 
where customers.city = 'MyCity' or orders.ShipTo = 'MyCity' 

ответ

1

Чтобы получить внешнее соединение, вы можете использовать DefaultIfEmpty Смотрите этот вопрос:. Linq to Sql: Multiple left outer joins

from c in context.Customers 
from o in context.Orders 
    .Where(a => a.customerid == c.id) 
    .DefaultIfEmpty() 
where c.City == "MyCity" || o.ShipTo == "MyCity" 
select c 

В качестве альтернативы, вы можете сделать это:

from c in context.Customers 
join o in context.Orders on c.id equals o.customerid into g 
from x in g.DefaultIfEmpty() 
where c.City == "MyCity" || x.ShipTo == "MyCity" 
select c 

Я считаю, что они оба генерируют один и тот же SQL.

+1

Да они порождают один и тот же SQL. Мне нравится внешний вид первого варианта над вторым. Благодарю. –

0

Вы должны использовать DefaultIfEmpty

Я думаю, что что-то подобное будет работать

var result = from c in context.Customers 
    join o in c.Orders on c.CustomerId equals o.CustomerId into lj 
    from or in lj.DefaultIfEmpty() 
    where c.City == "MyCity" || or.ShipTo == "MyCity" 
    select c 
Смежные вопросы