2011-01-31 12 views
5

Esta consulta devuelve el Id del empleado, el nombre, el ID de la empresa, el nombre de la empresa y la ciudad de la empresa. Me falta la dirección de correo electrónico de los empleados (dirección de correo electrónico almacenada en la tabla EmployeeEmailAddress) y los números de teléfono de los empleados (número de teléfono almacenado en la tabla EmpleePhoneNumbers)..SelectMany() y obtener datos de más de una tabla relacionada

Necesitaba agregar .SelectMany() para obtener la relación de la empresa matriz y acceder a la identificación, nombre y ciudad de la compañía. Ahora, sin embargo, no puedo acceder a ninguna propiedad que no se encuentre en la tabla PersonOrgMap. No puedo navegar a ninguna otra tabla. La eliminación de .SelectMany() me permite navegar a otras tablas, pero pierdo el acceso a la información de la compañía matriz.

var employees = Contacts.Where(c => c.ContactAttributes 
.Any (ca => ca.AttributeID == 1153)) 
.SelectMany (x => x.ChildPersonOrgMaps) 
.Select (c => new { employeeId = c.Child.ContactID, 
      c.Child.FirstName, 
      c.Child.LastName, 
      companyId = c.ParentContactID, 
      c.Parent.OrganizationName, 
      c.Parent.City 
     } 
     ) 
.OrderBy (c =>c.LastName).ThenBy(x => x.FirstName) 
.Dump(); 

Respuesta

5

Aquí es donde las expresiones de consulta realmente ayudan. Si inicia la consulta como la siguiente:

from c in Contacts 
where c.ContactAttributes.Any (ca => ca.AttributeID == 1153)) 
from om in c.ChildPersonOrgMaps 
... 

tendrá acceso tanto a los c y om las variables posteriores en la consulta. C# traduce esto en una llamada SelectMany seleccionando en un tipo anónimo temporal que "transporta" la variable original. La mejor manera de ver esto es escribiendo la consulta como una expresión de consulta en LINQPad, luego mira la pestaña lambda para ver la traducción en sintaxis fluida.

+4

+1 para el enchufe descarado LINQPad ;-) Muy buen producto! – DenaliHardtail

0

Estoy de acuerdo con Joe Albahari: use la sintaxis de la consulta. Esta es la única cosa (que yo sepa) que puede hacer con la consulta que no puede con la sintaxis del método.

Puede intentar seleccionar en un tipo anónimo que contenga sus objetos primarios y secundarios, pero no creo que a EF le guste mucho.

var employees = Contacts.Where(c => c.ContactAttributes 
.Any (ca => ca.AttributeID == 1153)) 
.SelectMany (x => new { Parent = x, Child = x.ChildPersonOrgMaps }) 
// etc 
16

Si usted está interesado en la sintaxis del método, entonces no hay una sobrecarga en SelectMany() que también le da acceso tanto a la "fuente" y "resultado" objetos:

.SelectMany(x => x.ChildPersonOrgMaps, (x, c) => new { x, c }) 
.Select(xc => new 
{ 
    xc.x.Attribute1, 
    xc.x.Attribute2, 
    xc.c.Child.Attribute3, 
    xc.c.Attribute4 
}); 
Cuestiones relacionadas