Как получить внешнее соединение по запросу Linq - PullRequest
0 голосов
/ 20 октября 2010

Учитывая этот запрос 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'

Ответы [ 2 ]

1 голос
/ 20 октября 2010

Чтобы получить внешнее соединение, вы можете использовать DefaultIfEmpty.Смотрите этот вопрос: Linq to Sql: несколько левых внешних объединений

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.

0 голосов
/ 20 октября 2010

Вы должны использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...