如何用C# LINQ对含子产品列表的OrdersList按Product.Id分组?
按产品ID分组的LINQ查询修正
你原代码的问题在于:
- 没有先扁平化所有订单中的产品列表,直接对订单集合操作无法获取单个产品
- 错误引用了
OrdersList.Product.Id,OrdersList是订单集合,不存在Product属性,应该访问单个订单下的产品ID
假设你的数据结构如下(方便理解):
public class Order { public int Id { get; set; } public DateTime Date { get; set; } public List<Product> Products { get; set; } } public class Product { public int Id { get; set; } // 其他属性如 Name、Price 等 }
正确的查询语法写法
var groupedProducts = from order in OrdersList // 嵌套遍历每个订单下的产品,实现扁平化 from product in order.Products // 按产品ID分组 group product by product.Id into productGroup // 选择分组结果,可按需扩展统计信息 select new { ProductId = productGroup.Key, // 该ID对应的所有产品实例 ProductItems = productGroup.ToList(), // 统计该产品出现在多少个不同订单中 RelatedOrdersCount = productGroup.Select(p => p.Order.Id).Distinct().Count() };
正确的方法语法写法
var groupedProducts = OrdersList // 扁平化所有订单的产品,得到单个产品的集合 .SelectMany(order => order.Products) // 按产品ID分组 .GroupBy(product => product.Id) // 转换为可读的结果结构 .Select(group => new { ProductId = group.Key, ProductItems = group.ToList(), RelatedOrdersCount = group.Select(p => p.Order.Id).Distinct().Count() });
关键说明
SelectMany是核心:它会把每个订单的Products列表展开,将多层集合转换为单层的产品集合,这样才能对单个产品进行分组操作。- 如果不需要额外统计信息,直接保留
GroupBy的结果即可,无需后续的Select。
内容的提问来源于stack exchange,提问作者Ilef jlassi
相关产品推荐
相关产品推荐

