2013-03-18 98 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 

我有2個地址返回的13

的重量,我只用了地址字段(不是產品),並和需要組地址的重量。我也需要歸還這個國家以及總計的重量。

這可能使用linq?或者我會更好地使用DataTable上的SqlDataAdaptor? 我知道我可以如何處理SqlDataAdaptor,但我不知道如何處理Linq,我猜linq會更適合開銷?

+0

它可以使用LINQ可以做到,但問題是:你嘗試過什麼? – MarcinJuraszek 2013-03-18 10:28:53

回答

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 2013-03-18 10:55:33

+0

@Stuart奇怪的決定,但你是OP :) – 2013-03-18 10:57:53

+1

我改變了主意。作爲AsEnumerable()的答案,這是更正確的@ – Stuart 2013-03-18 11:20:45

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到DataTable :) – 2013-03-18 10:31:21

+0

非常正確!歡呼聲 – Oliver 2013-03-18 10:34:04

+0

這是完美的。謝謝! – Stuart 2013-03-18 10:54:58