2014-12-04 115 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

相關問題