2009-11-20 2 views
17

Esistono molti esempi di outer join che utilizzano Linq to Sql, tutti su hinging su DefaultIfEmpty() che non è supportato da Linq su Entity Framework.È un join esterno possibile con Linq a Entity Framework

Questo significa che outer join non è possibile con LINQ to entità utilizzando .NET 3.5 (capisco che DefaultIfEmpty viene con 4.0 --- ma non è un'opzione in questo momento per me)

Qualcuno potrebbe si prega di fornire un esempio conciso utilizzando Linq a EntityFramework.

risposta

35

In LINQ alle entità, pensare in termini di relazioni anziché di join SQL. Quindi, l'equivalente letterale di un esterno SQL join su un'entità Person con uno a zero o un rapporto di CustomerInfo sarebbe:

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

L2E sarà confluire il join, in modo che se CustomerInfo è nullo, allora l'intera espressione valuta a null. Da qui il cast a un bool nullable, perché il tipo inferito di bool non annullabile non può contenere quel risultato.

Per uno-a-molti, si vuole in genere una gerarchia, piuttosto che una, SQL in stile set di risultati piatta:

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

Questo è come un sinistro unirsi nella misura in cui è ancora ottenere gli ordini con nessun dettaglio , ma è un grafico come OO piuttosto che un set come SQL.

+2

Questo è esattamente il tipo di risposta di qualità che stavo cercando. Grazie! –

+1

+1 non è sufficiente per una buona risposta come questa! – Arjang

+1

Grazie per il suggerimento. Quando qualcuno lo spiega così all'improvviso sembra così ovvio che in L2E si pensa alle relazioni tra gli oggetti e non ai tavoli, ma non ci avevo pensato. Una vera rivelazione ... – Quagmire