如何在LINQ中实现集合属性多字符串同时包含的通用查询逻辑
实现代码
直接使用LINQ的All方法替代原有硬编码的多条件与逻辑即可,修改后代码如下:
queryResult = questions.Where(q => q.proposition.Any(p => arrayStrings.All(keyword => p.Libelle.Contains(keyword)) ));
逻辑说明
All方法的特性是只有当数组中所有元素都满足判断条件时才会返回true,正好匹配你要求的「Libelle同时包含全部关键词」的筛选规则。- 如果你传入的关键词数组存在重复值(比如你示例中的两个
bb),且不需要重复校验相同关键词,建议先调用Distinct()去重减少不必要的计算,优化后写法:queryResult = questions.Where(q => q.proposition.Any(p => arrayStrings.Distinct().All(keyword => p.Libelle.Contains(keyword)) )); - 默认
Contains是区分大小写匹配的,如果需要忽略大小写,可调整判断逻辑为:p.Libelle.Contains(keyword, StringComparison.OrdinalIgnoreCase) - 该写法同时兼容内存集合查询、EF Core等ORM的数据库查询场景,不需要额外适配。
示例验证
你给出的测试用例中,arrayStrings = ["aa","bb","cc","ll","bb"],执行All判断时:
- 对
aabbccllllllppplmo:所有关键词都能匹配到,返回true,会被保留 - 对
jjjkkkkk、aakk:存在关键词匹配失败,返回false,会被过滤
和你的预期结果完全一致。
内容的提问来源于stack exchange,提问作者mecab1995
相关产品推荐
相关产品推荐

