C# LinQ中FindAll函数如何使用List集合实现多值筛选
实现方案
完全可以实现你要的多ID筛选效果,C#中没有直接在lambda表达式中使用in关键字的语法,我们可以借助List<T>.Contains()方法实现完全等价的逻辑。
注意原有代码的小问题
你现有单参数筛选的代码存在语法错误:x.LocationId= locationId是赋值操作,不是相等判断,正确的单参数筛选写法应为x.LocationId == locationId。
1. 匹配你原有写法的实现(已加载到内存的集合)
如果你确实需要先把全量数据加载到内存再筛选,写法如下:
// 入参为 List<int> locations items = ctx.listName.ToList().FindAll(x => locations.Contains(x.LocationId));
2. 推荐的高性能写法(针对EF/EF Core上下文场景)
原有写法先调用ToList()会把整张表的数据全部加载到内存再筛选,性能极低。建议把过滤逻辑放在ToList()之前,让筛选操作直接在数据库层面执行:
// 入参为 List<int> locations items = ctx.listName.Where(x => locations.Contains(x.LocationId)).ToList();
可选:空列表兼容逻辑
如果业务要求当传入的locations是空列表时返回所有数据,可以加一层判断:
items = ctx.listName.Where(x => !locations.Any() || locations.Contains(x.LocationId)).ToList();
内容的提问来源于stack exchange,提问作者Vignesh Subramanian
相关产品推荐
相关产品推荐

