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