2012-01-23 33 views
5

supongamos que tengo la siguiente tabla:Grupo A, Sum en LINQ

user type amount 
2 a 10 
2 b 20 
2 c 40 
3 a 15 
3 b 20 
3 c 45 

quiero reemplazar cantidad (c) con (c - (a + b)) la agrupación por el usuario y el tipo, ¿cómo podría ¿Hago esto? gracias

+1

en LINQ to SQL, o ya tiene los datos en una colección tipada (y por lo tanto, LINQ to Objects)? –

+0

Supongo que quiere decir que quiere agrupar por el valor del usuario, ya que todas las combinaciones de usuario y tipo son únicas. – Guffa

+0

LINQ to SQL, esta es una datatable genretaed – moeezed

Respuesta

4

Aquí está una manera:

ACTUALIZACIÓN (ahora usando Sum):

from item in table 
group item by item.user into g 
let a = (from i in g where i.type == "a" select i.amount).Sum() 
let b = (from i in g where i.type == "b" select i.amount).Sum() 
let c = (from i in g where i.type == "c" select i.amount).Sum() 
select c - (a + b); 
+0

Supongo que puede haber varias entradas por usuario de cada tipo. –

+0

No asumí eso, ya que el OP no especificó esto. En ese caso, la consulta será diferente (probablemente una 'Suma' en vez de 'Solo'). – Steven

+0

Lo asumí, porque él está hablando de 'SUM' en el título de la pregunta. Su último comentario apoya mi suposición. –

0

que sugeriría una expansión en la respuesta Steven 's, ya que sólo devolverá una secuencia de valores escalares c y no mantenerlos asociados con los usuarios o los importes a y b. Prueba esto:

var query1 = from i in table 
      group i by i.user 
      into g 
      let a = g.Where(t => t.type == "a").Sum(t => t.amount) 
      let b = g.Where(t => t.type == "b").Sum(t => t.amount) 
      let c = g.Where(t => t.type == "c").Sum(t => t.amount) 
        - (a + b) 
      select new {user = g.Key, a, b, c}; 

Entonces, si quieres convertirlo de nuevo en forma de tabla:

var query2 = query1.SelectMany(q => new List<TableType> 
            { 
             new TableType(q.user, "a", q.a), 
             new TableType(q.user, "b", q.b), 
             new TableType(q.user, "c", q.c) 
            }) 
            .OrderBy(t => t.user) 
            .ThenBy(t => t.type); 

Nota: He probado esto y funciona.