2014-11-05 47 views
2

我有下列包含命令插件列表的命令對象。我正在嘗試創建一個顯示所有插件類型及其數量總和的報表。LINQ按列表內部類型分組的項目總數列表

public class Order { 
    public IList<OrderAddon> OrderAddons { get; set; } 
} 

public class OrderAddon { 
    public enum OrderType { get; set; } 
    public string Name { get; set; } 
    public int Quantity { get; set; } 
} 

這是我在這裏並不能計算出,如果整個查詢是錯誤的,我只是失去了一些東西。

var query = from order in Model.Orders 
      from addon in order.OrderAddons 
      group order by addon.AddonType 
      into orderAddons select new 
      { 
       Name = orderAddons.Key, 
       Quantity = orderAddons.Sum(x => x.) << This is where I am stuck 
      }; 

當我打了。我的intellisense向我展示了屬性,而不是插件對象。

回答

4

這是因爲你說的是​​group order by ...,所以orderAddons對象變成了order s的分組。你可以使用這個,如果你打算從兩個對象需要的屬性:

from order in Model.Orders 
from addon in order.OrderAddons 
group new{addon, order} by addon.AddonType 
into orderAddons select new 
{ 
    Name = orderAddons.Key, 
    Quantity = orderAddons.Sum(x => x.addon.Quantity) 
}; 

如果這是您需要的所有數據,這是一個稍微簡單:

from order in Model.Orders 
from addon in order.OrderAddons 
group order.Quantity by addon.AddonType 
into quantityByAddonType select new 
{ 
    Name = quantityByAddonType.Key, 
    Quantity = quantityByAddonType.Sum() 
}; 
+0

有趣的是,每天學習新的東西。我不知道我能做到這一點。 :) – devfunkd 2014-11-05 00:26:01

4

替代語法相同的結果...

var result = Model.Orders 
    .SelectMany(order => order.OrderAddons) 
    .GroupBy(addon => addon.OrderType) 
    .Select(grouping => new 
    { 
     Name = grouping.Key, 
     Quantity = grouping.Sum(addon => addon.Quantity) 
    }); 
+3

直到我的日子結束時,我將+1方法鏈作爲優於查詢理解語法的優先選項。 – 2014-11-05 00:33:42

+0

@KirkWoll是的,我有同樣的政策! – Joe 2014-11-05 00:35:29