多组by和Sum LINQ

我有一个产品销售表,如下所示:

saleDate prod qty 10/22/09 soap 10 09/22/09 pills 05 09/25/09 soap 06 09/25/09 pills 15 

我需要制作每个MONTH的SUM,所以最终的表格看起来像这样:

 saleDate prod qty 10/09 soap 10 09/09 soap 06 09/09 pills 20 

我可以用LINQ做到这一点吗?

 var products = new[] { new {SaleDate = new DateTime(2009,10,22), Product = "Soap", Quantity = 10}, new {SaleDate = new DateTime(2009,09,22), Product = "Pills", Quantity = 5}, new {SaleDate = new DateTime(2009,09,25), Product = "Soap", Quantity = 6}, new {SaleDate = new DateTime(2009,09,25), Product = "Pills", Quantity = 15} }; var summary = from p in products let k = new { //try this if you need a date field // p.SaleDate.Date.AddDays(-1 *p.SaleDate.Day - 1) Month = p.SaleDate.ToString("MM/yy"), Product = p.Product } group p by k into t select new { Month = t.Key.Month, Product = t.Key.Product, Qty = t.Sum(p => p.Quantity) }; foreach (var item in summary) Console.WriteLine(item); //{ Month = 10/09, Product = Soap, Qty = 10 } //{ Month = 09/09, Product = Pills, Qty = 20 } //{ Month = 09/09, Product = Soap, Qty = 6 } 
 var q = from s in sales group s by new {saleDate = s.saleDate.ToString("MM/yy"), s.prod} into g select new { g.Key.saleDate, g.Key.prod, qty = g.Sum(s => s.qty) }; 
 class Program { static void Main(string[] args) { var sales = new List(); sales.Add(new Sale() { Product = "soap", saleDate = new DateTime(2009, 10, 22), Quantity = 10}); sales.Add(new Sale() { Product = "soap", saleDate = new DateTime(2009, 9,22), Quantity = 6}); sales.Add(new Sale() { Product = "pills", saleDate = new DateTime(2009,9,25), Quantity = 15}); sales.Add(new Sale() { Product = "pills", saleDate = new DateTime(2009,9,25), Quantity = 5}); var q = from s in sales group s by new { s.Product, s.saleDate.Month, s.saleDate.Year } into g select new {Month = String.Format("{0:MM/yy}", new DateTime(g.Key.Year, g.Key.Month, 1)), product = g.Key.Product, quantity = g.Sum(o=>o.Quantity)}; } } class Sale { public DateTime saleDate { get; set; } public int Quantity { get; set; } public string Product { get; set; } } 

当然。

它看起来像这样:

 var GroupedSales = from p in products group p by p.saleDate.Month into g select new { saleMonth = g.saleDate.Month, QtySold = g.Sum(p => p.qty) }; 

请参阅: http : //msdn.microsoft.com/en-us/vcsharp/aa336747.aspx#sumGrouped

另请注意,我的假设是您的数据集只有2009年的数据。 如果要按月/年分组,可以使用saleDate.ToString(“yyyyMM”)而不是saleDate.Month。