2009-07-21 18 views
7

ho un elenco di record con la seguente struttura: (! Esempio semplificato)Raggruppamento a più livelli in LINQ?

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

E sì, ho una lista <Vota> definito. Ho bisogno di convertire questa lista al seguente semplificata struttura:

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; 
} 

E vorrei farlo con una singola query LINQ. Posso elaborare altre soluzioni, ma la sfida è farlo all'interno di una dichiarazione LINQ. Fondamentalmente, il gruppo di livello superiore è raggruppato per codice. Il livello successivo dai valori InterestFrom e InterestTo e il livello più basso è un elenco di IncomeFrom, IncomeTo e Value.

Quindi, quale sarebbe la dichiarazione LINQ per questo?

+0

Potete fornire un elenco di ingresso Tariffe e l'output desiderato? –

+0

L'output desiderato è un singolo oggetto di tipo RateList. InterestFrom/InterestTo e IncomeFrom/IncomeTo sono valori ripetuti per ogni codice. Un esempio di record potrebbe essere: ("AB", 0, 6, 10000, 20000, 40,3) o ("AB", 6, 7,5, 10000, 20000, 40,3). –

+0

Hai detto "il livello più basso è raggruppato per IncomeFrom e IncomeTo." - Se questo è il caso, si sommerà il valore? O non intendevi davvero raggruppare su quei valori? (fermandosi agli interessi) –

risposta

18

Questo è abbastanza grande, ma qui è quello che ho:

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

Enorme non è un problema. :-) Voglio solo sapere se può essere fatto in una singola istruzione. (E poi controllando se rimane leggibile ...) –

+0

Questo è il modo più conciso in cui posso pensare di farlo adesso. L'unico buon modo che conosco per te per accorciarlo sarebbe avere dei semplici costruttori su quelle classi. Non taglierebbe troppo, ma aiuterebbe un po '. –

+0

E controllato il codice! Funziona! È una dichiarazione mostruosa, ma poi di nuovo, voglio scoraggiare gli sviluppatori meno esperti a modificarlo. E ad essere onesti, è ancora molto leggibile. –

Problemi correlati