2012-01-23 2 views
5

suppose que j'ai le tableau suivant:Group By, Somme dans LINQ

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

Je veux remplacer (c) montant avec (c - (a + b)) regroupement par l'utilisateur et le type, comment pourrait- Je fais ça? grâce

+1

dans LINQ to SQL, ou avez-vous déjà les données dans une collection typée (et donc, LINQ to Objects)? –

+0

Je suppose que vous voulez dire que vous voulez regrouper par la valeur de l'utilisateur, car toutes les combinaisons d'utilisateur et de type sont uniques? – Guffa

+0

LINQ to SQL, ceci est une donnée génératrice – moeezed

Répondre

4

Voici un moyen:

MISE À JOUR (en utilisant maintenant 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

Je suppose qu'il peut y avoir plusieurs entrées par utilisateur de chaque type. –

+0

Je n'ai pas supposé cela, puisque l'OP n'a pas spéculé cela. Dans ce cas, la requête sera différente (probablement un 'Sum' au lieu de' Single '). – Steven

+0

Je l'ai supposé, parce qu'il parle de 'SUM' dans le titre de la question. Son dernier commentaire soutient mon hypothèse. –

0

Je suggère une extension sur la réponse de Steven, car cela ne fera que retourner une séquence des valeurs scalaires c et ne pas les conserver associés aux utilisateurs ou aux montants a et b. Essayez ceci:

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

Ensuite, si vous voulez reconvertir en forme de tableau:

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

Note: Je l'ai testé cela et il fonctionne.