2013-04-19 6 views
21

linq (객체 목록)로 질의를하고 싶습니다. 실제로 어떻게 해야할지 모르겠지만 그룹과 합계를 할 수는 있지만 나머지는 선택할 수 없습니다 구역. 예 :복수 필드 선택 group by and sum

ID Value  Name Category 
1 5   Name1 Category1 
1 7   Name1 Category1 
2 1   Name2 Category2 
3 6   Name3 Category3 
3 2   Name3 Category3 

나는 값에 의해 ID, SUM으로 그룹화 할이 같은 모든 필드를 반환합니다.

ID Value  Name Category 
1 12  Name1 Category1 
2 1   Name2 Category2 
3 8   Name3 Category3 
+0

수표가 있습니까? 모든 필드가 고유하기 때문에 http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b 및 사례 : http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – Aristos

+0

각 ID, 그룹에 포함시키지 그래도 되겠습니까? – Habib

+0

예 할 수는 있지만 그 이상의 필드가 있습니다. ... ( – user2112420

답변

44

: 당신이 모든 필드에 대한 그룹화 피하려고하는 경우, 당신이 할 수있는 그룹 바로 옆 Id :

data.GroupBy(d => d.Id) 
    .Select(
     g => new 
     { 
      Key = g.Key, 
      Value = g.Sum(s => s.Value), 
      Name = g.First().Name, 
      Category = g.First().Category 
     }); 

그러나이 코드는 각각 Id에 대해 NameCategory이 적용된다고 가정합니다. 그렇다면 @Aron이 제안한대로 정규화를 고려해야합니다. 한 클래스에 IdValue을 유지하고 다른 클래스에 을 가지고있는 동안 Name, Category (및 다른 필드가 동일한 Id에 대해 동일 할 것임)을 이동하는 것을 암시합니다. 정규화 프로세스는 데이터 중복 및 종속성을 줄입니다.

+0

예 알아요.하지만 모든 필드를 그룹화하고 싶지는 않습니다. 다른 방법이 될 것입니다. 먼저()로 시도했지만 합산하는 방법은 무엇입니까? – user2112420

+0

답변을 업데이트했습니다. –

+0

네, 당신이 말하는 것을 알고 있습니다, 나는 DB를 정규화했습니다. 그것은 단지 내 쿼리의 결과입니다. 그러나 쿼리의 각 줄마다 값을 반복해서 나타내며, 나는 그것들을 집계하여 값을 합산합니다. – user2112420

2
void Main() 
{ 
      //Me being lazy in init 
    var foos = new [] 
    { 
     new Foo { Id = 1, Value = 5}, 
     new Foo { Id = 1, Value = 7}, 
     new Foo { Id = 2, Value = 1}, 
     new Foo { Id = 3, Value = 6}, 
     new Foo { Id = 3, Value = 2}, 
    }; 
    foreach(var x in foos) 
    { 
     x.Name = "Name" + x.Id; 
     x.Category = "Category" + x.Id; 
    } 
      //end init. 

    var result = from x in foos 
       group x.Value by new { x.Id, x.Name, x.Category} 
       into g 
       select new { g.Key.Id, g.Key.Name, g.Key.Category, Value = g.Sum()}; 
    Console.WriteLine(result); 
} 

// Define other methods and classes here 
public class Foo 
{ 
    public int Id {get;set;} 
    public int Value {get;set;} 

    public string Name {get;set;} 
    public string Category {get;set;} 
} 
+0

나는이 방법을 알고 있지만 내 그룹에 많은 분야가 있기를 원하지 않습니다. 그 이상이 있습니다. – user2112420

+0

@ user2112420 그러면 수업을 정상화해야합니다. – Aron

+0

결과 검색어 I 여러 테이블에서 수행하고이 유형의 개체를 만듭니다. – user2112420

1

이 시도 :

var objList = new List<SampleObject>(); 

objList.Add(new SampleObject() { ID = 1, Value = 5, Name = "Name1", Category = "Catergory1"}); 
objList.Add(new SampleObject() { ID = 1, Value = 7, Name = "Name1", Category = "Catergory1"}); 
objList.Add(new SampleObject() { ID = 2, Value = 1, Name = "Name2", Category = "Catergory2"}); 
objList.Add(new SampleObject() { ID = 3, Value = 6, Name = "Name3", Category = "Catergory3"}); 
objList.Add(new SampleObject() { ID = 3, Value = 2, Name = "Name3", Category = "Catergory3"}); 

var newList = from val in objList 
       group val by new { val.ID, val.Name, val.Category } into grouped 
       select new SampleObject() { ID = grouped.ID, Value = grouped.Sum(), Name = grouped.Name, Category = grouped.Category }; 

을 LINQPad 확인하기 : 업데이트

newList.Dump();