如何将字符串列表传入LINQ的Contains()方法实现数据查询
LINQ 传入字符串列表做Contains过滤的正确实现
场景1:筛选Code字段值存在于指定字符串列表中(对应SQL IN 逻辑,最常用)
这是该需求的常规实现,要注意把Contains方法调用放在你的字符串列表对象上,而不是字段上,示例如下:
// 1. 先定义你的过滤用字符串列表 List<string> targetCodeList = new List<string> { "code1", "code2", "code3" }; // 2. 编写查询逻辑 var test = _context.TableName .Where(e => e.type == "icon" && targetCodeList.Contains(e.Code)) .ToList();
该写法会被EF/EF Core自动翻译为类似如下的SQL,性能有保障:
SELECT * FROM TableName WHERE type = 'icon' AND Code IN ('code1','code2','code3')
场景2:筛选Code字段值包含字符串列表中任意一个元素
如果你的需求是模糊匹配,只要Code包含列表中的任意一个子串就算符合条件,EF Core 3.0及以上版本可以用以下写法:
List<string> filterKeywords = new List<string> { "icon", "test", "admin" }; var test = _context.TableName .Where(e => e.type == "icon" && filterKeywords.Any(key => e.Code.Contains(key))) .ToList();
注意事项
- 低版本EF/EF Core不支持场景2的写法,会触发客户端评估,导致全表数据加载到内存后再过滤,性能损耗极大,生产环境慎用
- 你原来的写法是把字符串列表作为参数传入字段的Contains方法,等价于判断
e.Code是否包含列表ToString后的固定字符串,完全不符合过滤需求
内容的提问来源于stack exchange,提问作者monika-115
相关产品推荐
相关产品推荐

