c# - linq 按子对象属性分组

标签 c# linq

我无法对我的结构进行分组。分组需要通过子属性来完成。我有Sellers ( List<SellerModel> ) 与 Products (List<ProductModel>)。每个产品都有 Category (CategoryId)。作为输入,我有 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)

最佳答案

问题是您在尝试分组之前跳过了几个步骤。

以下应该会产生您要查找的内容:

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

关于c# - linq 按子对象属性分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30217231/

相关文章:

c# - 如何使用参数值对 Controller 使用 Custom AuthorizeAttribute?

当我添加到 C# 树时,它正在复制每个节点

c# - 在同一 View 中显示局部 View mvc4

c# - ICollection<Person> 的返回类型是什么意思?

c# - 从具有父引用的对象创建嵌套的项目列表

c# - 如果值在不同的表中,Linq 查询不会返回正确的结果

c# - 动态 Linq 搜索多种类型的多列,包括可空类型

c# - 如何将键值对从控制台应用程序传递到字典

c# - 按公共(public)前缀划分的字符串 block 列表

c# - 在 C# 中创建泛型方法