2009-11-20 21 views
17

Hay muchos ejemplos de unión externa que utilizan Linq a Sql, todos ellos enlazados en DefaultIfEmpty() que no son compatibles con Linq to Entity Framework.Es posible una unión externa con Linq to Entity Framework

¿Quiere esto decir que combinación externa no es posible con LINQ to Entidad utilizando .NET 3.5 (entiendo que DefaultIfEmpty viene con 4,0 --- pero eso no es una opción en este momento para mí)

Podría alguien por favor proporcione un ejemplo conciso utilizando Linq para EntityFramework.

Respuesta

35

En LINQ to Entities, piense en términos de relaciones en lugar de uniones de SQL. Por lo tanto, el equivalente literal de un exterior SQL se unen en una entidad Person con un uno a cero o una relación a CustomerInfo sería:

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

L2E será coalescer la unión, de modo que si CustomerInfo es nulo entonces toda la expresión evalúa a nulo. De ahí el lanzamiento a un bool nullable, porque el tipo inferido de bool no nulable no podía contener ese resultado.

Para uno-a-muchos, por lo general quieren una jerarquía, en lugar de una, conjunto de resultados al estilo SQL plana:

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

Esto es como una combinación izquierda en la medida en que sigue recibiendo pedidos sin detalles , pero es un gráfico como OO en lugar de un conjunto como SQL.

+2

Este es exactamente el tipo de respuesta de calidad que estaba buscando. ¡Gracias! –

+1

+1 no es suficiente para una buena respuesta como esta! – Arjang

+1

Gracias por la sugerencia. Cuando alguien lo deletrea así, de repente parece tan obvio que en L2E piensas en las relaciones entre los objetos y no en las tablas, pero no había pensado en ello. Una verdadera revelación ... – Quagmire

Cuestiones relacionadas