LINQ使用GroupBy的字典对象

时间:2015-05-03 18:33:22

标签: c# linq

我在LINQ Group By Clause中使用Dictionary对象。

只要我在结果中没有重复的项目名称,它就可以正常工作。

但是,当 GroupBy 查询遇到重复的项目名称时,它会失败。

我不确定我是否正确使用了GroupBy子句中的Dictionary对象?请指教。

这是我的模特

public class Item
{
    public string CustomerName { get; set; }
    public Dictionary<string, float?> ItemCost { get; set; }
    public float? Cost{ get; set; }
    public float? TotalCost{ get; set; }
}

以下是我的选择查询(LINQ)以及GroupBy

        var result = myFilteredQuery
            .Select(x => new
            {
                ItemName = x.Item.Name,
                Cost= x.Item.Cost,
                CustomerName = x.Item.Customer.Name,

            }).ToList();

以下是我的GroupBy查询。

            return result .GroupBy(x => new { x.CustomerName})
          .Select(x => new CostByItem
          {
              CustomerName = x.Key.CustomerName,
              LineItem = x.ToDictionary(y => y.ItemName, y => y.Cost),
              TotalCost= x.Sum(y => y.Cost)
          }).ToList();

p.s。我正在尝试发送按客户分组的创建数据结构,而不是每个客户字典对象项目成本(项目名称,项目成本)和该客户的总成本。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望按客户对项目进行分组,然后按名称对项目进行分组。您需要使用GroupBy 两次

result.GroupBy(x => x.CustomerName)
      .Select(x => new CostByItem
      {
          CustomerName = x.Key,
          LineItem = x.GroupBy(y => y.ItemName)
                      .ToDictionary(y => y.Key, y => y.Sum(z => z.Cost)),
          TotalCost = x.Sum(y => y.Cost)
      }).ToList();

另请注意,无需使用x => new { x.CustomerName}。按字符串值分组就足够了 - 不需要创建匿名类型。