2015-05-13 4 views
0

Я не могу сделать группировку по моей структуре. Группировка должна выполняться детским имуществом. У меня есть Sellers (List<SellerModel>) с Products (List<ProductModel>). Каждый продукт имеет Category (CategoryId). В качестве ввода у меня есть List<SellerModel>. И в качестве вывода мне нужен список категорий. (List<CategoryModel>)linq grouping by children object property

Структура модели мне нужно иметь следующий:

public class CategoryModel 
{ 
    public Guid Id {get;set;}   
    public List<SellerModel> Sellers { get; set; }    
} 

public class SellerModel 
{ 
    public Guid Id {get;set;}   
    public List<ProductModel> Products { get; set; }    
} 

public class ProductModel 
{ 
    public Guid Id {get;set;}   
    public string Name {get;set;} 
    public Guid CategoryId {get;set;} // THIS IS THE PROPERTY TO GROUP BY 
} 

Теперь я должен группе ProductModel.CategoryId. Итак, структура результата - List<CategoryModel>, но это был бы не простой список категорий. Это будет список, содержащий продавцы и продукты. Imaging, если у вас есть список продавцов, которые продают разные продукты в разных категориях. И теперь вам нужно знать все доступные категории. А также вы должны знать, какой продавец продает какие продукты в данной категории.

Я пытался сделать некоторые группировки, но я очень новичок в LinQ, и это не базовая группировка, я думаю. Я считаю, что я не понимаю логики, как делать группировку здесь.

var t = sellers.GroupBy(x => x.Products.Select(y => y.CategoryId)).Select(a => a.Key) 
+0

Так что вы хотите получить список всех категорий? – CSharpie

+0

Что вы хотите сгруппировать кем? –

ответ

2

Проблема заключается в том, что вы пропустите несколько шагов, прежде чем пытаться сгруппировать.

Ниже следует производить то, что вы ищете:

   // obtain a set of all { CategoryId, Seller } pairs 
var n = sellers.SelectMany(s => s.Products.Select(p => new { 
        p.CategoryId, 
        Seller = s 
       })) 
       // group those by CategoryId 
       .GroupBy(cs => cs.CategoryId) 
       // create a CategoryModel from each group 
       .Select(g => new CategoryModel { 
        Id = g.Key, 
        Sellers = g.Select(cp => cp.Seller).ToList() 
       }) 
       //make a list 
       .ToList(); 
+0

Удивительный! Это сработало для меня, и я понимаю вашу логику. – renathy

1

Функции группировки работают над списком и свойством, общим для всех элементов списка.

У вас есть 2 вариант:

  • продавцы группы, которую вы от продуктов, а затем сгруппировать эту группы по категориям на основе CategoryId. Таким образом, вы не теряете информацию в этом процессе.
  • Вы переводите список продавцов в больший список продуктов (с помощью SelectMany), а затем вы группируете их по категории.