2011-10-06 10 views
9

tengo un problema aquí con la obtención de datos de mi base de datos con LINQLINQ complejo propiedad de navegación consulta

Tengo dos tablas Team y TeamMember, los cuales están relacionados por 1-N relación. Estoy usando Entity Framework y tengo una entidad para cada una de las tablas con una propiedad para cada columna. También en la entidad Team hay una propiedad de navegación TeamMember como resultado de esta relación.

Deseo hacer una consulta en la que pueda obtener todo mi equipo con los miembros de su equipo.

result = (from t in this.context.Teams 
      orderby t.Name 
      select t) 
     .Include("TeamMembers") 

Eso funciona bien. Obtengo una colección de entidades de equipo con la propiedad Team.TeamMember poblada con los datos del miembro de cada equipo.

El problema es cuando quiero hacer una consulta más compleja como filtrar la consulta para los Miembros de equipo.

Por ejemplo, ambas tablas tienen una columna EndDateTime. Si quiero obtener todos los miembros del equipo y del equipo que no han finalizado (su fecha de finalización no es nula), no sé cómo hacerlo.

Con esta consulta voy a filtrar solo los equipos, pero no los miembros del equipo.

result = (from t in this.context.Teams 
      where t.EndDateTime == null 
      orderby t.Name 
      select t) 
     .Include("TeamMembers") 
     .ToList(); 

¿Alguna idea?

tipo de "resolverlo" haciendo el filtro del miembro después de la consulta, a la colección. De esta manera:

//Filter out the End dated care coordiantors 
var careCoordinatorsToDelete = new List<CareCoordinator>(); 
foreach (var team in result) 
{ 
    careCoordinatorsToDelete.Clear(); 

    foreach (var careCoordinator in team.CareCoordinators) 
    { 
     if (careCoordinator.EndDateTime != null) 
      careCoordinatorsToDelete.Add(careCoordinator); 
    } 

    foreach (var toDelete in careCoordinatorsToDelete) 
    { 
     team.CareCoordinators.Remove(toDelete); 
    } 
} 

Pero no creo que esta sea una buena solución.

+0

posible duplicado de [incluir condicional en linq a entidades?] (Http://stackoverflow.com/questions/1085462/conditional-include-in-linq-to-entities) –

+0

+1 Esta es una gran pregunta y una de las cosas menos obvias que hacer con EF, pero es un duplicado. Creo que hay algunos otros duplicados también. –

+0

otro duplicado: http://stackoverflow.com/questions/1680863/linq-include-with-where-clause –

Respuesta

1

Como he señalado, creo que es un duplicado. Pero al resumir las respuestas, solo necesita incluir la cláusula Where en el elemento secundario como parte de la declaración Select (usándola como parte de un tipo anónimo), enumerar la consulta y luego recuperar los objetos que desee.

Como ha seleccionado el TeamMembers que desea en otra propiedad, se recuperarán de la base de datos y se construirán en su gráfico de objetos.

result = (from t in this.context.Teams 
      where t.EndDateTime == null 
      orderby t.Name 
      select new 
      { 
       Team = t, 
       Members = t.TeamMembers.Where(tm => tm.EndDateTime == null) 
      }) 
     .ToList() 
     .Select(anon => anon.Team) 
     .ToList(); 
+0

Hey. ¡Lo he intentado pero no funciona! ¿Podría ser porque tengo la carga Lazy desactivada? –

+0

@Asier - .ToList() fuerza la ejecución de la consulta, por lo tanto, el ejemplo es la carga ansiosa, no la carga diferida ... – barrypicker

0

esto debería funcionar:

var result = this.context.Teams.Where(t=>t.EndDateTime==null).Select(t=> 
new { Name = t.Name, 
      PropertyX = t.PropertyX... //pull any other needed team properties. 
      CareCoordinators = t.CareCoordinators.Where(c=>c.EndDateTime==null) 
}).ToList(); 

Esto devuelve una lista de objetos anónimos.

Cuestiones relacionadas