2011-11-15 26 views
7

He pasado los últimos 2 días tratando de averiguar cómo hacer una unión IZQUIERDA real en LINQ y no he tenido éxito. Tengo una tabla de usuario que tiene una columna "Primary2Address" que podría ser NULL a menudo. así que tengo que hacer una PARTIDA IZQUIERDA aquí. Además, en la tabla de direcciones, tengo más relación que podría ser NULL, por lo que tengo que hacer múltiples IZQUIERDAS.
Cada intento de LINQ lo hago emitiendo algunas sentencias sql EN GRAVE CON SINDICATOS, declaraciones SELECT anidadas y cosas más alocadas.
Todo lo que necesito es:¿Cómo hacer IZQUIERDA UNIÓN en LINQ a Entidades?

SELECT u.UserName FROM Users u 
LEFT JOIN Addresses a ON a.AddressiD = u.Primary2Address 
LEFT JOIN States s ON s.StateID = a.Address2State 
LEFT JOIN Countries c ON c.CountryID = a.CountryID 

Por favor, ayuda! Hasta ahora, mi solución consistía en crear un procedimiento almacenado que utilizara mi declaración sql anterior, pero realmente me gustaría intentar hacer esto con LINQ (L2E). ¡Gracias chicos!

+3

¿Cómo su consulta difieren de solo SELECT u.UserName de los usuarios u'? – svick

Respuesta

18

DefaultIfEmpty se utiliza para la izquierda se une para ADO.NET Entity Framework 4+

var query = from u in context.Users 
      from a in context.Addresses 
          .Where(x => u.Primary2Address == x.AddressiD) 
          .DefaultIfEmpty() 
      from s in context.States 
          .Where(x => a.Address2State == x.StateID) 
          .DefaultIfEmpty() 
      from c in context.Countries 
          .Where(x => a.CountryID == x.CountryID) 
          .DefaultIfEmpty() 
      select u.UserName; 
+0

¡Eres mi héroe! Guau, después de tantas horas ... Tu consulta es tan directa como vienen y la obtengo ahora. ¡Gracias a un millón de Aducci! – Losbear

+0

Según el comentario de @ svick sobre la pregunta, ¿cómo difiere esto de 'de ti en el contexto. Los usuarios seleccionan u.NombreUsuario'? – AakashM

+0

@AakashM: si un usuario tiene varias direcciones, obtendrá un resultado diferente. Más importante aún, creo que la pregunta se ha simplificado. – Aducci