我有以下课程:
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
,但这不起作用。
答案 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());