LINQ GroupBy 3 properties?

本文关键字:properties GroupBy LINQ | 更新日期: 2023-09-27 18:12:50

我有以下类:

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

和一个在我的ViewModels中使用的类,看起来像这样:

 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,但没有工作。

LINQ GroupBy 3 properties?

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

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

这可以工作,因为匿名类型实现Equals()GetHashCode()按值进行比较。

你说你想要一个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());