2013-05-09 3 views
0

У меня есть следующий класс:LINQ GroupBy 3 свойства?

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 

как бы я ВИР te этот запрос в LINQ при запуске со списком ProductInventory? Я попытался использовать несколько .GroupBy, но это не сработало.

ответ

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()); 
5

Вы должны группе объекта с несколькими свойствами:

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

Это работает, потому что анонимные типы реализации Equals() и GetHashCode() сравнить по значению.