2012-04-15 35 views
2

LINQ的搜索查詢我有一個文本框,這需要自由文本,作爲一個搜索輸入,我有一個LINQ查詢,我想用這種類型的搜索延伸。實現關鍵字的n個和AND/OR選項

的輸入可以是像"big blue car"這應該導致在搜索包含所有這些字詞的查詢。

還有切換到「任何詞」的代替「所有單詞」選項。

什麼是加入到我的LINQ查詢的最佳/最簡單的方法是什麼?

查詢現在看起來像

from b in books 
where b.InStore == true && b.Price > 10 && title.Contains()...at this point i want to add the text search. 
select b 

回答

1

我強烈reccommend了兩種查詢做到這一點!

但是看看這個,是不是很酷?

var searchAll = true; 
var words = List<string>{"big", "blue", "car"}; 

from b in books 
where (...) (searchAll && words.All(x => title.contains(x))) || 
      (!searchAll && words.Any(x => title.Contains(x))) 
select b 

但你真的應該做兩個不同的查詢。

+1

確實,這看起來不錯!究竟是什麼原因,你更喜歡2查詢這一個查詢? – Tys 2012-04-15 00:30:47

+0

@TysHTTP。那麼......這是一個品味的問題。我認爲它在兩個查詢中更具可讀性。你是老闆!無論如何,這很酷,並回答你的問題。 **:)** – gdoron 2012-04-15 00:33:42

+0

是的,我想是的。那麼我的查詢有更多的標準,所以添加這一點不會讓它更難以讀懂:)謝謝! – Tys 2012-04-15 00:37:50

0

我首先將查詢和標題爲單詞,然後檢查遏制。粗剪是

string[] queryParts = query.Split(' '); 

books.Where(b => b.InStore) 
    .Where(b => b.Price > 10) 
    .Where(b => queryParts.Any(part => b.Title.Split(' ').Contains(part))) 

對於任何查詢,

string[] queryParts = query.Split(' '); 

books.Where(b => b.InStore) 
    .Where(b => b.Price > 10) 
    .Where(b => queryParts.All(part => b.Title.Split(' ').Contains(part))) 

的所有查詢。

我們必須標題分成的話,因爲默認String.Contains方法查找任何字符串匹配,這意味着

"ABC DEF".Contains("A") 

回報true,即使爲了這個目的,我們不希望它。

注意,這些解決方案都假設的話總是被空間,這是不正確的一般界定。您的用戶可以在單詞之間鍵入製表符,使用引號分隔單詞組(例如「紐約」)等等。

+0

他要求一個**單個查詢**與**兩個選項**閱讀[這個答案](http://stackoverflow.com/a/10158503/601179) – gdoron 2012-04-15 06:59:36