2012-07-19 80 views
7

我一直在試圖解決這個問題整天,並沒有找到一個真正有效的解決方案。當我搜索一些數據時,我想根據多個詞過濾出數據。LINQ查詢匹配多個詞

我的輸入值使用標準的分割函數進行分割。

string[] searchstrings = MessageResult.Split(' '); 

我做了一個查詢(這顯然不正常),它試圖過濾掉所有在searchstrings每個字符串匹配的條目。

    var suggestions = (from a in query 
           from w in searchstrings 
           where a.Message.ToLower().Contains(w.ToLower()) 
           select a).Distinct(); 

查詢是我的變量,它具有所有的數據。我怎樣才能使這個查詢實際上只匹配搜索字符串中包含每個字符串的條目?

+0

爲了澄清,您希望查詢中包含每個拆分字符串的字符串,也就是說,searchString中的每個**字符串都必須位於結果字符串中? – Breland 2012-07-19 12:31:42

+0

如果@Breland的問題是真的,那是否會工作改變.Contains to。全部 我希望看到由該表達式生成的查詢 – jjchiw 2012-07-19 12:35:10

+0

什麼應該是您的最終輸出? – Yasser 2012-07-19 12:35:14

回答

17

我認爲下面的代碼應該可以解決您的問題。它檢查searchstring中的所有單詞是否在查詢中(a)。

var suggestions = (from a in query 
        where searchstrings.All(word => a.ToLower().Contains(word.ToLower())) 
        select a); 
+0

這很好,謝謝! – Alexander 2012-07-19 12:56:20

16
var query = new string[] 
{ 
    "abc foo bar xyz john doe", 
    "abc foo bar xyz doe", 
    "hello world", 
    "abc foo bar john doe", 
}; 

var searchstrings = new string[] 
{ 
    "abc", 
    "foo", 
    "john", 
    "xyz", 
}; 

searchstrings = searchstrings.Select(x => x.ToLower()).ToArray(); 

var results = query.Select(x => x.ToLower()) 
        .Where(x => searchstrings.All(y => x.Contains(y))); 

注:
ToLower()Where條款外進行,節省了大量的調用該方法的。

+3

用於重構'.ToLower'調用... – 2012-07-19 12:47:39