EF Core多对多关系下访问末尾表属性实现商品分组筛选报错问题
问题原因
- 你的
Product实体和产品组是多对多关联,Product上的Groups是集合属性,不是单个对象,因此无法直接用c.Group访问分组属性 - 此前从中间表发起查询出现商品重复,是因为多对多关联JOIN后,一个商品对应多个分组会返回多行数据
解决方案
1. 修正产品组(PG)筛选逻辑
用Any方法做子查询筛选,不会产生重复数据,写法如下:
if (PG != null && PG.Count != 0) { // 筛选关联了任意指定分组的商品 result = result.Where(c => c.Groups.Any(g => PG.Contains(g.ProductGroup.GroupId))); }
如果你的中间表实体Groups里已经直接存储了GroupId字段,也可以简化为:
result = result.Where(c => c.Groups.Any(g => PG.Contains(g.GroupId)));
该写法生成的SQL是EXISTS子查询,不会把分组表的数据JOIN到商品结果集中,天然避免了商品重复展示的问题。
2. 补充其他参数的空校验
你当前代码中brandId、tWidth、rDiameter等列表参数直接访问Count属性,如果调用时传入null会抛出空引用异常,建议统一补充null判断,示例:
// 原代码 if (brandId.Count != 0) // 修改后 if (brandId != null && brandId.Count != 0)
其余tWidth、rDiameter参数的判断逻辑也做相同修改即可。
内容的提问来源于stack exchange,提问作者irancss
相关产品推荐
相关产品推荐

