2012-01-23 3 views
5

나는 다음과 같은 테이블이 있다고 가정그룹으로는, 합계는 LINQ

내가 함께 (C) 양을 대체 할
user type amount 
2 a 10 
2 b 20 
2 c 40 
3 a 15 
3 b 20 
3 c 45 

(C - (A + B)) 사용자와 유형, 어떻게 수에 의해 그룹화 나는 이것을한다? 그는 시퀀스를 반환하기 때문에, 내가 스티븐의 대답에 확장을 제안

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

또는 LINQ to SQL에 이미 형식화 된 컬렉션 (및 LINQ to Objects)의 데이터가 있습니까? –

+0

사용자 및 유형의 모든 조합이 고유하므로 사용자 값별로 그룹화하려는 것을 의미한다고 생각하십니까? – Guffa

+0

LINQ to SQL, 이것은 고유 한 데이터 테이블 – moeezed

답변

4

는 방법입니다 스칼라 c 값은 사용자와 연결되어 있지 않거나 ab 값과 연결되어 있지 않습니다. 이 시도 :

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

을 그런 다음 테이블 형식으로 다시 변환 할 경우 :

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

참고 :이 테스트를했는데 그것을 작동합니다.

+0

각 유형의 사용자마다 여러 항목이있을 수 있다고 가정합니다. –

+0

OP가 이것을 구체적으로 언급하지 않았기 때문에 나는 그렇게 생각하지 않았습니다. 이 경우 쿼리는 다를 것입니다 (아마도'Single' 대신에'Sum'). – Steven

+0

질문 제목에 'SUM'을 말하고 있기 때문에 나는 그것을 추측했다. 그의 최근 논평은 내 가정을지지한다. –

0

:

UPDATE (지금 Sum 사용) : 감사

여기