2012-01-23 17 views
5

supponiamo di avere la seguente tabella:Group By, Somma in LINQ

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

voglio sostituire (c) l'importo con (c - (a + b)), il raggruppamento da parte dell'utente e tipo, come potrebbe Lo faccio? grazie

+1

in LINQ to SQL oppure i dati sono già presenti in una raccolta tipizzata (e quindi LINQ su oggetti)? –

+0

Suppongo che intendi che desideri raggruppare in base al valore dell'utente, poiché tutte le combinazioni di utente e tipo sono uniche? – Guffa

+0

LINQ to SQL, questo è un databile genificato – moeezed

risposta

4

Ecco un modo:

UPDATE (ora utilizzando 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

Suppongo che possano esserci più voci per utente di ciascun tipo. –

+0

Non ho dato per scontato che, dal momento che l'OP non ha specificato questo. In tal caso la query sarà diversa (probabilmente un 'Sum' invece di' Single'). – Steven

+0

L'ho assunto, perché sta parlando di 'SUM' nel titolo della domanda. Il suo ultimo commento sostiene la mia ipotesi. –

0

Vorrei suggerire un'espansione sul risposta Steven s', dal momento che restituirà solo una sequenza dei valori scalari c e non li tengono associati agli utenti o agli importi a e . Prova questo:

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

Quindi, se si vuole riconvertirlo in forma tabellare:

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: Ho provato questo e funziona.