2013-03-18 1 views
0

나는 DataTable의 제품을 보유하고 있습니다. 각 제품에는 무게와 반송 주소가 있습니다. 리턴 주소는 7 개의 필드로 구성됩니다.다른 주소의 합계에 대한 Linq

고유 한 주소를 순환하여 제품의 총 무게를 합산해야합니다.

예 테이블

Product weight address1 address2 address3   city   state    postcode country 
A123 6  House  1st Street some place   a city   a state    AB1 2CD  GB 
A456 3  House  1st Street some place   a city   a state    AB1 2CD  GB 
A789 4  House  1st Street some place   a city   a state    AB1 2CD  GB 
A123 6  House2  2st Street another place  another city another state  EF2 3GH  GB 
A456 3  House2  2st Street another place  another city another state  EF2 3GH  GB 
A789 4  House2  2st Street another place  another city another state  EF2 3GH  GB 

나는이 주소가 난 단지 주소 필드 (없는 제품)와 합으로 그룹에 필요한 13

의 무게를 반환 할 것이다 ... 같을 것이다 주소로 무게. 나는 또한 합계 무게뿐만 아니라 국가를 돌려 줄 필요가있다.

linq를 사용하면 가능합니까? 또는 DataTableSqlDataAdaptor을 사용하는 것이 더 낫습니까? 나는 내가 어떻게 SqlDataAdaptor와 함께 할 수 있었는지 알고 있지만 Linq과 어떻게 해야할지 모르겠다. 그리고 나는 linq이 오버 헤드에 더 좋을 것이라고 생각한다.

모든 주소 필드를 기준으로
+0

그것은 LINQ를 사용하여 수행 할 수 있지만, 문제는 : 당신은 무엇을 시도? – MarcinJuraszek

답변

2

그룹 테이블 행, 각 그룹에 대한 계산 합계 : 무게의 모든 주소 주소 속성에 필드와 합계에있을 것이다 당신에게 익명의 객체의 순서를 줄 것이다

var query = 
    from p in table.AsEnumerable() 
    group p by new { 
     Address1 = p.Field<string>("address1"), 
     Address2 = p.Field<string>("address2"), 
     Address3 = p.Field<string>("address3"), 
     City = p.Field<string>("city"), 
     State = p.Field<string>("state"), 
     Postcode = p.Field<string>("postcode"), 
     Country = p.Field<string>("country") 
    } into g 
    select new { 
     Address = g.Key, 
     TotalWeight = g.Sum(x => x.Field<int>("weight")) 
    }; 

, TotalWeight 속성

+0

위대함, +1이지만 이전 답변으로 표시됩니다. 그러나 검색에서 이것을 보는 사람은 모두 정답입니다! – Stuart

+0

@Stuart 이상한 결정이지만, 당신은 OP : –

+1

나는 내 마음을 바 꾸었습니다. 이것은'AsEnumerable()' – Stuart

3

GroupBy()은 모든 제품을 고유 주소별로 하위 모음으로 그룹화합니다. 그러면 Select()은 총 중량을 제공하기 위해 각 하위 모음의 가중치를 합산합니다.

var totals = products 
     .GroupBy(p => new 
     { 
      address1 = p.Field<string>("address1"), 
      address2 = p.Field<string>("address2"), 
      address3 = p.Field<string>("address3"), 
      city = p.Field<string>("city"), 
      state = p.Field<string>("state"), 
      postcode = p.Field<string>("postcode"), 
      country = p.Field<string>("country") 
     }) 
     .Select(g => new 
     { 
      Total = g.Sum(p => p.Field<int>("weight"), 
      Country = g.Key.country 
     }); 

사용 예 :

foreach (var address in totals) 
{ 
    Console.WriteLine(string.Format("Country: {0}, Weight: {1}", address.Country, address.Total)); 
} 
+0

제품은 DataTable이므로 Linq to DataTable을 사용해야합니다. –

+0

맞음 ! 건배 – Oliver

+0

이것은 완벽합니다. 고맙습니다! – Stuart