2014-02-06 2 views
2

Я работаю над сжатием двух запросов linq в один запрос. В основном, я пытаюсь достичь следующего запроса, чтобы получить всю информацию, связанную с пользователем, независимо от того, имеют ли они какие-либо заказы или нет.Linq to Entities left join return 0 записей

Поскольку я написал запрос в настоящее время, он работает отлично, если существует хотя бы один заказ для идентификатора пользователя, который я перехожу в метод.

Это мое понимание, что .DefaultIfEmpty() является эквивалентом linq SQL-левого соединения, однако следующий запрос возвращает 0 записей для любого пользователя, который еще не разместил заказ.

Запросы

var orders = (from u in db.people where u.id == UserId 
         join o in db.product_transactions.DefaultIfEmpty() on u.id equals o.user_id 
         join sta in db.order_statuses.DefaultIfEmpty() on o.order_status equals sta.id 
         join ship in db.shipping_types.DefaultIfEmpty() on o.shipping_type equals ship.shipping_id 
         select new { o, u, sta, ship }).ToList(); 

ответ

3

Есть два способа создать левую Регистрацию

1) с использованием into и from

join o in db.product_transactions on u.id equals o.user_id into og 
from o in og.DefaultIfEmpty() 

2) с использованием from и Where

from o in db.product_transactions.Where(x => u.id == x.user_id).DefaultIfEmpty() 
2

.DefaultIfEmpty() не является синтаксисом левого соединения. .DefaultIfEmpty() - это часть синтаксиса левого соединения, которая даст вам значение по умолчанию, если ячейка равна нулю.

An example left join from MSDN, обратите внимание на и из.

var query = from person in people 
      join pet in pets on person equals pet.Owner into gj 
      from subpet in gj.DefaultIfEmpty() 
      select new { person.FirstName, PetName = (subpet == null ? String.Empty : subpet.Name) };