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
相关产品推荐
相关产品推荐

