2009-11-20 10 views
17

Istnieje wiele przykładów sprzężenia zewnętrznego za pomocą Linq do Sql, wszystkie z nich są osadzone na DefaultIfEmpty(), który nie jest obsługiwany przez Linq do Entity Framework.Czy łączenie zewnętrzne jest możliwe z Linq do Entity Framework

Czy to znaczy, że sprzężenie zewnętrzne nie jest to możliwe z LINQ do jednostki przy użyciu .NET 3.5 (rozumiem, że DefaultIfEmpty nadchodzi z 4,0 --- ale nie jest to opcja w tym momencie dla mnie)

Może ktoś proszę podać zwięzły przykład używając Linq do EntityFramework.

Odpowiedz

35

W LINQ do Entities, pomyśl raczej w kategoriach relacji niż połączeń SQL. Stąd dosłownym odpowiednikiem zewnętrznej SQL przyłączyć na jednostkę Person z jednym zero lub jeden związek z CustomerInfo to:

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

L2E koagulują łączenia, tak że jeśli CustomerInfo jest nieważna, to cały ekspresja ocenia na wartość null. Stąd rzutowanie na zerowy bool, ponieważ wywnioskowany typ nie-nullable-boolu nie był w stanie utrzymać takiego wyniku.

Dla jednego-do-wielu, zazwyczaj chcą hierarchii, zamiast płaskiego, SQL stylu zestaw wyników:

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

To jest jak lewa dołączyć, o ile jeszcze dostać zlecenia bez szczegółów , ale jest to wykres taki jak OO, a nie zbiór jak SQL.

+2

To jest dokładnie taka jakość odpowiedzi, której szukałem. Dziękuję Ci! –

+1

+1 nie wystarcza, aby uzyskać dobrą odpowiedź w ten sposób! – Arjang

+1

Dziękuję za napiwek. Kiedy ktoś tak to przeliteruje, nagle wydaje się tak oczywiste, że w L2E myślisz o związkach między przedmiotami, a nie tabelami, ale nie myślałem o tym. Prawdziwy otwieracz do oczu ... – Quagmire

Powiązane problemy