2014-11-05 27 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