如何查询包含任何一组字符串中的一个或多个的项目(以能够转换为SQL的方式)?
如何查询包含任何一组字符串中的一个或多个的项目(以能够转换为SQL的方式)?
我有两个列表:
- 带有评论字段的主列表
- 要搜索的关键字列表
我想在每个记录的评论字段中搜索关键字,使用SQL语句如下所示:
select * from MainList where Comment like '%keyword1%' or Comment like '%keyword2%' ... 一直到最后一个关键字。
到目前为止,我看到的例子通常只能一次搜索一个关键字
例如:LINQ with non-lambda for Any Contains
我希望能够同时搜索每个关键字在MainList中的每个记录。
类似于:
var newList = MainList.Where(m => m.Comments.Contains(purposes))
我更喜欢使用lambda语法来完成,但如果不可能,LINQ也可以。
问题的出现原因是用户想要查询包含一个或多个字符串的项的方法。
解决方法是添加一个扩展方法,可以帮助生成这样的谓词。使用方法很简单,将关键字列表传递给扩展方法,指定匹配条件,然后将结果转换为列表。
实现的方法是,根据关键字列表构建表达式,将其应用于每个项,并将它们连接在一起。例如,如果关键字列表包含keyword1、keyword2和keyword3,那么生成的表达式相当于m => m.Comments.Contains(keyword1) || m.Comments.Contains(keyword2) || m.Comments.Contains(keyword3)。
某些情况下可以使用LinqKit包中的PredicateBuilder来实现动态个数的析取。但是,也有人认为这个实现更加简洁有效,避免了额外的依赖和循环迭代。
虽然有人认为这个代码片段可能会导致维护困难,但也有人认为它已经在其他项目中使用多年,并且功能正常。
总结起来,这个问题的解决方法是通过添加一个扩展方法来生成查询项的谓词,方法使用简单且功能有效。尽管有人对代码的复杂性和维护性提出了疑问,但也有人认为这个实现已经经过多年验证并且运行良好。