2009-11-20 2 views
17

Существует множество примеров внешнего соединения с использованием Linq to Sql, все из которых основаны на DefaultIfEmpty(), который не поддерживается Linq to Entity Framework.Возможно ли внешнее соединение с Linq to Entity Framework

Означает ли это, что внешнее соединение не возможно с Linq к Entity с использованием .NET 3.5 (я понимаю, что DefaultIfEmpty приходит с 4,0 --- но это не вариант на данный момент для меня)

Может кто-нибудь пожалуйста, укажите краткий пример использования Linq для EntityFramework.

ответ

35

В LINQ to Entities подумайте о терминах отношений, а не о соединениях SQL. Таким образом, буквальный эквивалент SQL внешнего соединения в сущности Person с один к нулю или одного отношения к CustomerInfo будет:

var q = from p in Context.People 
     select new 
     { 
      Name = p.Name, 
      IsPreferredCustomer = (bool?)p.CustomerInfo.IsPreferredCustomer 
     }; 

L2E сольются объединения, так что если CustomerInfo равно нулю, то все выражение имеет значение null. Следовательно, приведение к обнуляемому bool, потому что предполагаемый тип non-nullable bool не смог сохранить этот результат.

один-к-многим, обычно вы хотите иерархию, а не плоский, SQL-стиль результирующего набора:

var q = from o in Context.Orders 
     select new 
     { 
      OrderNo = o.OrderNo, 
      PartNumbers = from od in o.OrderDetails 
          select od.PartNumber 
     } 

Это как левый присоединиться, поскольку вы все еще получаете заказы без деталей , но это график, похожий на OO, а не на такой набор, как SQL.

+2

Это именно тот качественный ответ, который я искал. Спасибо! –

+1

+1 этого недостаточно для хорошего ответа! – Arjang

+1

Благодарим вас за отзыв. Когда кто-то говорит это так, внезапно кажется настолько очевидным, что в L2E вы думаете об отношениях между объектами, а не о таблицах, но я не думал об этом. Настоящий глазник ... – Quagmire

Смежные вопросы