2009-10-26 17 views
17

W moim repozytorium implementacji mogę uruchomić następującą kwerendę za pomocą wyrażenia lambda:Jak kwerendy zagnieżdżone listy przy użyciu lambda wyrażenia

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

tej pory tak dobrze, proste rzeczy. Mam jednak trudności z zapisaniem wyrażenia lambda na zagnieżdżonej -> zagnieżdżonej liście. Biorąc pod uwagę następujący przykład (przepraszam nie mógł wymyślić lepszego jeden):

Następująca kwerenda działa absolutnie w porządku i zwraca wszystkie kluby, które mają członków w wieku powyżej 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; 
     } 

W tej chwili to tam kończy się moja wiedza o ekspresji lambda.

Jak mogę napisać powyższe zapytanie przeciwko ClubRepository, używając wyrażenia lambda, podobnego do powyższego przykładu?

Odpowiedz

23

To może działać (niesprawdzone) ...

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

miłe! Działa świetnie. – Flo

+3

FWIW, to podejście działa, ale tak naprawdę nie jest w stanie przetłumaczyć wielu instrukcji "od" na metody LINQ. Potrzebujesz do tego metody SelectMany (to właśnie robi kompilator C#). –

14

Oto jeden ze sposobów, aby to zrobić:

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

możesz wyjaśnić nieco więcej w tym zapytaniu .. dzięki –

+2

SelectMany() spłaszcza listę list ... http://stackoverflow.com/questions/958949/difference-between-select-and-selectmany – hagensoft