如何检查字符串是否包含实体框架中列表中的任何字符串?

Ano*_*ser 6 c# entity-framework

我正在尝试搜索数据库以查看字符串是否包含搜索项列表的元素.

var searchTerms = new List<string> { "car", "232" };
var result = context.Data.Where(data => data.Name.Contains(searchTerms) ||
                                        data.Code.Contains(searchTerms));
Run Code Online (Sandbox Code Playgroud)

如果searchTerms是一个字符串,这将有效,但我一直试图让它与字符串列表一起使用.

基本上我需要SQL来说

SELECT * FROM Data
WHERE Name LIKE '%car%'
OR Name LIKE '%232%'
OR Code LIKE '%car%'
OR Code LIKE '%232%'
Run Code Online (Sandbox Code Playgroud)

列表中包含任何列表的linq似乎是我能找到的关闭情况.

Where(data => searchTerms.Contains(data.Name) || searchTerms.Contains(data.Code) 只会将完全匹配带回搜索字词列表.

我也尝试在Entity Framework中搜索多个关键字搜索,并且已经用尽了这些努力.有没有办法实现我的目标?

Nin*_*Nye 13

我迟到了,但是使用SearchExtensions nuget包你可以做类似以下的事情

var result = context.Data.Search(x => x.Name, x => x.Code).Containing(searchTerms);
Run Code Online (Sandbox Code Playgroud)

这将构建一个表达式树,因此仍将在服务器上执行查询(而不是在内存中),并且基本上将运行您想要的SQL

  • 比使用任何可以生成过深嵌套查询并导致异常的更好. (2认同)

Sel*_*enç 11

您可以尝试使用Any方法,我不确定它是否受支持但是值得尝试:

var result = context.Data.Where(data => searchTerms.Any(x => data.Name.Contains(x)) ||
                                        searchTerms.Any(x => data.Code.Contains(x));
Run Code Online (Sandbox Code Playgroud)

如果这样NotSupportedException您可以在AsEnumerable之前添加Where以获取所有记录并在内存而不是DB中执行查询.

  • 如果数据有100万条记录怎么办? (5认同)