2009-10-26 55 views
17

En mi aplicación repositorio que se puede ejecutar la siguiente consulta utilizando una expresión lambda:Cómo consultar una lista anidada utilizando una expresión lambda

public IList<User> GetUsersFromCountry(string) 
{ 
    return _UserRepository.Where(x => x.Country == "Sweden").ToList();     
} 

Hasta ahora tan bueno, sencillo. Sin embargo, tengo dificultades para escribir una expresión lambda en una lista anidada anidada. Teniendo en cuenta el ejemplo siguiente (lo siento no podía pensar en una mejor uno):

La siguiente consulta funciona absolutamente bien y devuelve todos los clubes, que tienen los miembros mayores de 45

public IList<Clubs> GetGoldMembers() 
     { 
      var clubs = from c in ClubRepository 
          from m in c.Memberships 
          where m.User.Age > 45 
          select c; 

      return clubs; 
     } 

Por el momento, aquí es donde termina mi conocimiento de la expresión lambda.

¿Cómo podría escribir la consulta anterior contra el ClubRepository, utilizando una expresión lambda, similar al ejemplo anterior?

Respuesta

23

Esto podría funcionar (no probado) ...

var clubs = ClubRepository.Where(c=>c.MemberShips.Any(m=>m.User.Age > 45)); 
+0

Nice! Funciona perfectamente. – Flo

+3

FWIW, este enfoque funciona, pero realmente no domina cómo traducir las declaraciones múltiples 'de' en los métodos LINQ. Necesitas el método SelectMany para eso (eso es lo que hace el compilador C#). –

14

Aquí hay una manera de hacerlo:

var clubs = clubRepository 
    .SelectMany(c => c.Memberships, (c, m) => new { c, m }) 
    .Where(x => x.m.User.Age > 45) 
    .Select(x => x.c); 
+2

puede por favor elaborar un poco más sobre esta consulta ... gracias –

+2

SelectMany() aplana una lista de listas ... http://stackoverflow.com/questions/958949/difference-between-select-and-selectmany – hagensoft

Cuestiones relacionadas