You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 19:10:36