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

C#中用Where In子句结合谓词筛选数据(按ID列表查询)

解决C#中谓词实现Where In筛选的问题

问题原因

你的代码错误出在x.EntityId.Contains(supplierIdsList)这一行:

  • 逻辑完全颠倒:需求是判断**x.EntityId是否存在于supplierIdsList列表中**,而非单个值包含整个列表
  • 类型不匹配:supplierIdsList是int类型列表,x.EntityId若为字符串类型,直接调用Contains会触发类型错误

修正方案

根据EntityId的实际类型,选择对应写法:

情况1:EntityId是int类型

直接调用列表的Contains方法判断元素是否在列表内:

supplierIdsList.Add(246); 
supplierIdsList.Add(249); 
supplierIdsList.Add(1551260);

var flagPredicate = new List<Expression<Func<FlagEntity, bool>>>();

flagPredicate.Add(x => x.Deleted == "0" && x.Flag.IsDeleted == "0" && x.Flag.Status == "1");
// 修正Where In逻辑:判断x.EntityId是否在supplierIdsList中
flagPredicate.Add(x => (x.EntityType == 5 && x.EntityId == 1551260) || 
                       (x.EntityType == 10 && supplierIdsList.Contains(x.EntityId)));

var flagData1 = GetAsync(flagPredicate).ToList();

情况2:EntityId是string类型

需先将字符串转换为int(确保格式合法),再判断是否在列表中:

supplierIdsList.Add(246); 
supplierIdsList.Add(249); 
supplierIdsList.Add(1551260);

var flagPredicate = new List<Expression<Func<FlagEntity, bool>>>();

flagPredicate.Add(x => x.Deleted == "0" && x.Flag.IsDeleted == "0" && x.Flag.Status == "1");
// 先转换类型再判断,同时处理转换失败的情况(可选)
flagPredicate.Add(x => (x.EntityType == 5 && x.EntityId == "1551260") || 
                       (x.EntityType == 10 && int.TryParse(x.EntityId, out int id) && supplierIdsList.Contains(id)));

var flagData1 = GetAsync(flagPredicate).ToList();

额外说明

如果你的GetAsync方法是将多个谓词用AND逻辑组合,最终筛选条件会是:
(通用条件) AND ((EntityType=5且ID=1551260) OR (EntityType=10且ID在列表中))
完全匹配你的需求逻辑。

内容的提问来源于stack exchange,提问作者Komal Garg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:32:17