2009-07-21 15 views
7

Mam listę rekordów z następującą strukturę: (! Przykład uproszczony)Grupowanie wielopoziomowe w LINQ?

class Rate 
{ 
    string Code; 
    double InterestFrom; 
    double InterestTo; 
    double IncomeFrom; 
    double IncomeTo; 
    double Value; 
} 

I tak, mam listę < Oceń > zdefiniowane. Trzeba przekonwertować tę listę do następnego uproszczonej strukturze:

class RateList 
{ 
    List<Code> code; 
} 
class Code 
{ 
    string code; 
    List<Interest> interest; 
} 
class Interest 
{ 
    double InterestFrom; 
    double InterestTo; 
    List<Income> income; 
} 
class Income 
{ 
    double IncomeFrom; 
    double IncomeTo; 
    double Value; 
} 

I chciałbym to zrobić za pomocą pojedynczego zapytania LINQ. Mogę wypracować inne rozwiązania, ale wyzwaniem jest zrobienie tego w jednym oświadczeniu LINQ. Zasadniczo grupa najwyższego poziomu jest pogrupowana według kodu. Następny poziom według wartości InterestFrom i InterestTo oraz najniższy poziom to lista IncomeFrom, IncomeTo i Value.

Jaki byłby w związku z tym komunikat LINQ?

+0

możesz dostarczyć listę stawek wejściowych i pożądany wynik? –

+0

Pożądanym wynikiem jest pojedynczy obiekt typu RateList. InterestFrom/InterestTo i IncomeFrom/IncomeTo to powtarzające się wartości dla każdego kodu. Przykładowy zapis to: ("AB", 0, 6, 10000, 20000, 40.3) lub ("AB", 6, 7,5, 10000, 20000, 40,3). –

+0

Wspominasz, że "najniższy poziom jest pogrupowany według IncomeFrom i IncomeTo". - Jeśli tak, czy suma wartości zostanie zsumowana? Czy naprawdę nie chciałeś pogrupować się na tych wartościach? (zatrzymując się na odsetkach) –

Odpowiedz

18

Jest to dość duże, ale tutaj jest to, co mam:

var rateList = new RateList 
       { 
        code = (from r in rates 
          group r by r.Code into g 
          select new Code 
          { 
           code = g.Key, 
           interest = (from i in g 
              group i by new {i.InterestFrom, i.InterestTo} into g2 
              select new Interest 
              { 
               InterestFrom = g2.Key.InterestFrom, 
               InterestTo = g2.Key.InterestTo, 
               income = (from inc in g2 
                 select new Income 
                 { 
                  IncomeFrom = inc.IncomeFrom, 
                  IncomeTo = inc.IncomeTo, 
                  Value = inc.Value 
                 }).ToList() 
              }).ToList() 
          }).ToList() 
       }; 
+0

Ogromny nie jest problemem. :-) Po prostu chcesz wiedzieć, czy można to zrobić w pojedynczej instrukcji. (A następnie sprawdzanie, czy pozostanie czytelne ...) –

+0

To jest najbardziej zwięzły sposób, w jaki mogę teraz to zrobić. Jedynym dobrym sposobem, jaki znam, aby go skrócić, byłoby posiadanie prostych konstruktorów na tych zajęciach. Nie za bardzo by to wyszło, ale pomogłoby to trochę. –

+0

I sprawdził kod! To działa! To potworne stwierdzenie, ale znowu chcę zniechęcić mniej doświadczonych programistów do modyfikowania go. I szczerze mówiąc, nadal jest bardzo czytelny. –