LINQ GroupBy 3个房产?

时间:2013-05-09 21:08:15

标签: c# linq entity-framework

我有以下课程:

public class ProductInventory : Entity
{
    public virtual Product Product { get; set; }
    public DateTime ExpirationDate { get; set; }
    public Manager Manager { get; set; }
}

和我的ViewModel中使用的类看起来像这样:

 public class ProductInventoryCountModel
{
    public Product Product { get; set; }
    public DateTime ExpirationDate { get; set; }
    public int Count { get; set; }
}

我希望获得Dictionary<Manager, List<ProductInventoryCountModel>的输出,它基本上按经理显示产品,然后按到期日期显示,这样我就可以打印出类似这样的实际数据:

ManagerBoB

 --ProductA, Expires 8/15/13, Count: 10
 --ProductA, Expires 10/10/13, Count: 40
 --ProductB, Expires 6/13/13, Count: 30

ManagerTim

 --ProductA, Expires 10/10/13, Count: 5
 --ProductB, Expires 5/25/13, Count: 10
 --ProductB, Expires 6/13/13, Count 40

当从ProductInventory列表开始时,如何在LINQ中编写此查询?我尝试使用多个.GroupBy,但这不起作用。

2 个答案:

答案 0 :(得分:5)

您需要按具有多个属性的对象进行分组:

list.GroupBy(p => new { p.Manager, p.Product.Name, p.ExpirationDate.Date })

这是有效的,因为匿名类型会实现Equals()GetHashCode()来按值进行比较。

答案 1 :(得分:1)

你说你想要一个Dictionary<Manager, List<ProductInventoryCountModel>>,所以我认为你必须这样做:

var dictionary = 
    db.ProductInventory.GroupBy(x => new { x.Manager, x.Product, x.ExpirationDate })
      .ToDictionary(g => g.Key.Manager,
                    g => g.Select(x => new ProductInventoryCountModel 
                                  {
                                      Product = x.Key.Product,
                                      ExpirationDate = x.Key.ExpirationDate,
                                      Count = x.Count()
                                  }).ToList());