2009-07-21 18 views
7

tengo una lista de registros con la siguiente estructura: (ejemplo simplificado)Agrupación de varios niveles en LINQ?

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

Y sí, tengo una lista <Tasa> definido. Necesito convertir esta lista a la estructura simplificada siguiente:

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

Y me gustaría hacer esto con una sola consulta LINQ. Puedo encontrar otras soluciones pero el desafío es hacerlo dentro de una declaración LINQ. Básicamente, el grupo de nivel superior está agrupado por código. El siguiente nivel por los valores InterestFrom e InterestTo y el nivel más bajo es una lista de IncomeFrom, IncomeTo y Value.

Entonces, ¿cuál sería la declaración de LINQ para esto?

+0

Se puede suministrar una lista de tarifas y de entrada la salida deseada? –

+0

El resultado deseado es un objeto único de tipo RateList. InterestFrom/InterestTo y IncomeFrom/IncomeTo están repitiendo valores para cada código. Un registro de ejemplo sería: ("AB", 0, 6, 10000, 20000, 40.3) o ("AB", 6, 7.5, 10000, 20000, 40.3). –

+0

Menciona "el nivel más bajo está agrupado por IncomeFrom e IncomeTo". - Si este es el caso, ¿se sumará el 'Value's? ¿O realmente no quisiste agrupar esos valores? (deteniéndose en interés) –

Respuesta

18

Esto es bastante grande, pero aquí es lo que tengo:

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 no hay problema. :-) Solo quiero saber si se puede hacer en una sola declaración. (Y luego verifica si sigue siendo legible ...) –

+0

Esta es la forma más concisa que puedo pensar para hacerlo ahora. La única buena forma que conozco de acortarlo sería tener algunos constructores simples en esas clases. No reduciría demasiado, pero ayudaría un poco. –

+0

¡Y verificó el código! ¡Funciona! Es una afirmación monstruosa pero, una vez más, quiero disuadir a los desarrolladores menos experimentados de modificarla. Y para ser sincero, sigue siendo muy legible. –

Cuestiones relacionadas