2012-10-05 5 views
0

linq 문 (C#, 쿼리 구문이지만 sytax 메서드를 처리 할 수 ​​있음)을 구성하는 데 약간의 문제가 있습니다. 계산 된 속성을 노출하는 것뿐만 아니라 그룹화를 지원해야합니다. 나는 각각을 개별적으로 다루지 만 함께 일하는 것처럼 보이지는 않는다. 어떤 도움을 주시면 감사하겠습니다.linq 계산 된 그룹 별 값

데이터

GrpField   Qty  Price 
-------------  ---  ----- 
RED    1  10 
RED    2  10 
RED    1  50 
BLUE    2  30 
BLUE    2  50 

출력이 총 저를 얻는다 각 그룹

원하는 결과

RED 80 
BLUE 160 

에 대한 총 가격 (수량 * 가격)의 합 필요 가격 전화 번호

from x in origdata 
let linetotal = x.qty * x.price 
select new { x.grpfield, x.qty, x.price, linetotal } 

하지만 익명 형식의 합계와 같은 집계를 실행할 수 없기 때문에 새 익명 형식으로 그룹화 할 수 없습니다. 먼저 그룹을 운영한다면 전체 합계보다 먼저 합산을 계산하는 방법을 알 수 없습니다.

답변

3

...

var data = new[] 
    { 
     new {GrpField = "RED", Qty = 1, Price = 10}, 
     new {GrpField = "RED", Qty = 2, Price = 10}, 
     new {GrpField = "RED", Qty = 1, Price = 50}, 
     new {GrpField = "BLUE", Qty = 2, Price = 30}, 
     new {GrpField = "BLUE", Qty = 2, Price = 50}, 
    }; 

var grouped = 
    from d in data 
    group d by d.GrpField 
    into g 
    select new {Group = g.Key, Sum = g.Sum(x => x.Qty * x.Price)}; 

foreach(var g in grouped) 
    Console.WriteLine("{0} - {1}", g.Group, g.Sum); 
+0

그 문은 내 생각이 아니었다 - 그것은 컴파일러했다 원래 쿼리를 가져 와서 anon 형식으로 그룹을 실행하려고하면 오류 (및 MS 설명서에서). 트릭은 (당신과 다른 답변들에 의해 입증 된 것처럼) 먼저 그룹을 수행하는 것이었다. – ktharsis

2

그룹 먼저 작업을 합산하십시오. 익명 형식 문에 합계처럼 실행할 수 없기 때문에 집계에 대한 증거로

origdata.GroupBy(m => m.GrpField) 
.Select(group => new { 
    GrpField = group.Key, 
    CalculatedValue = group.Sum(m => m.qty * m.price) 
    }); 
1
origdata.GroupBy(p=>p.GrpField) 
.Select(p=> new() 
{ 
    GrpField=p=>p.Key, 
    Sum=p.Sum(q=>q.Qty*q.Price) 
})