Lambda匹配对象属性或其子列表属性时出现问题求助
问题描述
我编写了一段Lambda查询代码用于筛选符合条件的采购记录,代码如下:
select = this.Model .Where(a => DateTime.Now.Subtract(a.CreateDate).TotalDays <= range) .Where(i => i.PayDate != DateTime.MinValue) .Where(x => x.Product.Equals(product) || x.Items.Any(y => y.Type.Equals(product)));
其中|| x.Items.Any(y => y.Type.Equals(product))这部分代码导致查询出现问题,移除该部分后代码可正常运行。
数据结构如下:
-Model(list) -Purchase(object) Product(ProductType) Price(float) -Items(list) -PurchaseItem(object) Type(ProductType) Price(float) -purc...
我需要筛选出主产品匹配product,或子列表Items中存在Type匹配product的采购记录,请问哪里出错了?
可能的问题及修复方案
1. 空引用异常
如果Purchase对象的Items列表为null,直接调用Any()方法会触发空引用错误。修复时先判断Items是否不为null:
.Where(x => x.Product.Equals(product) || (x.Items != null && x.Items.Any(y => y.Type.Equals(product))));
2. ProductType的比较逻辑问题
如果ProductType是自定义类型,默认的Equals方法可能无法正确比较内容:
- 若为枚举类型:优先用
==运算符替代Equals,避免装箱导致的比较异常,比如y.Type == product。 - 若为自定义类:检查是否重写了
Equals和GetHashCode方法,若没重写,建议直接比较类的标识字段(如ID),比如y.Type.Id == product.Id。
3. ORM查询转换限制
如果使用EF等ORM框架,Any()在多条件组合查询中可能存在SQL转换失败的情况。可以尝试:
- 将多个
Where合并为单一条件,减少查询拆分; - 用
AsEnumerable()先把前两步过滤后的数据集拉到内存,再执行包含Items.Any()的过滤(注意:数据量较大时慎用,避免内存占用过高):
select = this.Model .Where(a => DateTime.Now.Subtract(a.CreateDate).TotalDays <= range) .Where(i => i.PayDate != DateTime.MinValue) .AsEnumerable() .Where(x => x.Product.Equals(product) || (x.Items != null && x.Items.Any(y => y.Type.Equals(product))));
内容的提问来源于stack exchange,提问作者SaFteiNZz
相关产品推荐
相关产品推荐

