linq分组由儿童对象属性

时间:2015-05-13 14:03:08

标签: c# linq

我无法对我的结构进行分组。分组需要由子财产完成。我SellersList<SellerModel>)与ProductsList<ProductModel>)。每个产品都有CategoryCategoryId)。作为输入,我有List<SellerModel>。作为输出我需要类别列表。 (List<CategoryModel>

我需要的模型结构如下:

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>,但它不是一个简单的类别列表。它将列出包含卖家和产品的列表。 如果您有卖不同类别产品的卖家列表,请进行成像。现在您需要了解所有可用的不同类别。此外,您还必须知道哪个卖家销售特定类别的产品。

我试图做一些分组,但我对LinQ很新,我认为这不是基本的分组。我相信我不明白如何在这里进行分组的逻辑。

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

2 个答案:

答案 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();

答案 1 :(得分:1)

分组函数适用于列表和列表中所有元素共享的属性。

您有两个选择:

  • 您按产品对卖家进行分组,然后根据categoryId按类别对此组进行分组。这样,您就不会在此过程中丢失信息。
  • 您将卖家列表转换为更大的产品列表(使用SelectMany),然后根据categoryId进行分组。