2009-06-17 2 views
8

To naprawdę powinno być łatwe, ale po prostu nie może się dogadać sam interfejs nie jest na tyle intuicyjny ... :(Zaznaczanie wszystkich obiektów podrzędnych w Linq

Powiedzmy mam State tabelę, a Chcę zaznaczyć wszystkie Counties z wielu States w SQL byłoby.

select c.* 
    from State s join County c on c.StateCode = s.StateCode 
where s.TimeZone = -5 -- or some other criteria 

powyższy przykład jest dosyć banalna do konwersji Linq w statycznym kontekstu:

var q = MyDataContext.GetTable<County>().Where(c => c.State.TimeZone = -5); 

Ale gdzie zaczyna coraz skomplikowana jest sytuacja, gdy chcę bardziej wrażliwe zapytania kontekstowe, takie jak:

public static List<County> GetCountiesForStates(List<State> states) { 
    // gotta do something to return all the counties for all these states 
} 

Teraz mógłby zrobić coś jak to wewnątrz tej metody:

var q = MyDataContext.GetTable<County>().Where(c => states.Contains(c.State)); 

ale IMO to jest naprawdę nieeleganckie, ponieważ (a) muszę uzyskać statyczne MyDataContext zamiast używać niejawnego kontekstu danych obiektów stanu i (b) pracujesz wstecz, a jeśli zaczniesz komplikować zapytanie dalej, robi się jeszcze brzydsza.

Czy istnieje sposób uruchamiania frazę:

var q = states... // or "from s in states..." 

instynktownie, chcę wierzyć, można to zrobić, ale jeszcze nie znalazł drogę ...

Odpowiedz

26

Można zrób to:

var q = from c in countries 
     from s in c.States 
     where c.Property == Something 
     select s; 

To da ci listę wszystkich państw we wszystkich krajach. Przekłada się to na:

var q = countries.Where(x => c.Property == Something).SelectMany(c => c.States); 
+4

+1 za włączenie rozszerzenia lambda. –

+0

Właśnie tego chciałem - DZIĘKUJĘ! –

+3

Po prostu mała literówka - powinno być "countries.Where (c => c.Property) etc ... –