2014-12-04 118 views
4

我正在尝试搜索数据库以查看一个字符串是否包含搜索项列表的元素。如何检查字符串是否包含实体框架中的列表中的任何字符串?

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

如果searchTerms是一个字符串,但我一直在试图把它与一个字符串列表工作时,此会的工作。

基本上我需要SQL它会说

SELECT * FROM Data 
WHERE Name LIKE '%car%' 
OR Name LIKE '%232%' 
OR Code LIKE '%car%' 
OR Code LIKE '%232%' 

linq where list contains any in list似乎是关闭的事情我能找到的情况。

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

我也尝试过在实体框架中搜索多个关键字搜索,并且已经用尽了这种努力。有什么方法可以实现我的目标?

回答

8

您可以尝试使用Any方法,我不知道是否它的支持,但它是值得一试:

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

如果这让你NotSupportedException可以Where前添加AsEnumerable获取所有记录并执行查询在内存中而不是数据库。

+4

如果数据有100万条记录怎么办? – hunter 2017-02-02 15:22:58

2

您可以使用Linq的Any函数来查看是否有任何项包含在数据中。

var result = context.Data.Where(data => searchTerms.Any(term => data.Name.Contains(term) || 
             searchTerms.Any(term => data.Code.Contains(term)); 
8

,我迟到了,但使用SearchExtensions nuget package你可以做类似下面

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

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

+1

比使用Any可以产生太深嵌套的查询并导致异常更好。 – user2250152 2016-10-10 11:54:23

相关问题