Myślisz, że zarabiasz tyle, na ile zasługujesz? Zapraszamy do wzięcia udziału w anonimowej ankiecie.
3

Witam, czy ktos mogłby mi wyjaśnić jak można za pomocą zapytania LINQ przechodzić przez kilka zagnieżdżonych słowników i list? Podam może przykład, wtedy będzie wszystko jasne: mamy klasę np. miasto. Oprócz mnóstwa właściwości posada ono także Listę o nazwie dzielnice, ktora jest oczywiście listą obiektów klasy dzielnica. Klasa dzielnica również ma sporą ilość właściwości i również posiada własną Listę o nazwie ulice. Lista ta jest analogicznie listą obiektów klasy ulica, która z kolei ma swoje właściwości i swój Słownik o nazwie domy. Moglibyśmy tak zagnieżdżać przykłady jeszcze bardzo długo, ale chciałbym np zapytaniem linq wydobyć tylko te domy, których numer jest z przedziału 4-10. Czy istnieje taka możliwość zbudowania zapytania linq mając dostęp tylko do obiektu 'Miasto'? Czy muszę budować pętle foreach aby przejść kolejno przez listę 'dzielnice', wewnątrz pętla przechodząca przez ulice, i dla każdej z ulic przeglądać Dictionary domy aby uzyskać wynik? Czy może LINQ jest w stanie tu pomóc?

Bartoles

EDIT:

Dzięki za pomoc, odpowiedzi były konkretne i błyskawiczne. Wszystkie sposoby się sprawdzają doskonale (przetestowałem SelectMany() z wyrażeniami lambda jak i wieloskladnikowe 'from'. Generalnie i tak wszystko sprowadza się do przejrzenia list generycznych, więc jest to podobne do budowania pętli for czy foreach, jednak dzięki LINQ nie musimy przejrzanych wynikow zapisywac w jakichs specjalnych kontenerach lecz od razu mamy gotowy rezultat z ścisłą niejawną kontrolą typów (czyli var)

Pozdrawiam

flag
Zapunktuj/zaakceptuj, którąś z odpowiedzi. :) – rafek Feb 11 at 13:41
rafek nie podlizuj sie ;-) – bodziec Feb 11 at 13:49

2 Answers

1

Nie mam czasu teraz na "wgryzienie" się, ale na pierwszy rzut oka wygląda na to, że potrzebujesz najpierw operacji flatten na odpowiednich kolekcjach, a następnie wydobyć to co Cię interesuje. Ten link może być pomocny.

link|flag
1

Czy to nie będzie zrobione przez Join ? (nie wiem czy składni nie pomieszałem)

var result = from a in A
             join b from a.B on b.a_id = a.id
             join c from b.C on c.b_id = b.id
             where c.Nr >= 4 && c.Nr 

albo

var result = from a in A
             from b in a.B
             from c in b.C
             where c.Nr >= 4 && c.Nr 
link|flag

Your Answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.