2013-03-28 50 views
3

我正嘗試使用linq創建一個有效的搜索。在一個字段內匹配幾個項目

用戶輸入他們的搜索關鍵字(或前幾個字符),然後將其解析爲一個數組。

在第一部分,我想找到所有的話都發現了搜索領域的實例。 (稍後,我搜索任何,但該部分正在工作)

string[] arSearchString = searchString.Split(',', ' ', ';'); 
var codes = from c in CodeList 
      where arSearchString.All(val => c.Description.StartsWith(val) || 
              c.Description.Contains(" " + val)) 
      select c; 

這不會返回任何內容。

我希望發生的是返回,其中陣列中的所有單詞都說明字段 內發現例如項目,如果他們輸入「貓的狗」,我該回去了諸如:

"A Cat and a Dog" 
"Dogs and Cats" 
"Catatonic Dogma" 

但不是隻匹配其中一個鍵的項目(例如,「我的生活作爲狗」)

任何人都可以發現我做錯了什麼或提供解決方案嗎?

回答

5

確保你把外殼考慮。使用ToUpper作爲優化字符串比較。 編輯:我已經走了ToUpperInvariant是文化安全的:)

試試這個:

string[] arSearchString = searchString.Split(',', ' ', ';'); 
var codes = from c in CodeList 
     where arSearchString.All(val => c.Description.ToUpperInvariant().StartsWith(val.ToUpperInvariant()) || 
           c.Description.ToUpperInvariant().Contains(" " + val.ToUpperInvariant())) 
     select c; 

但我真的很想將其轉換成鏈,因爲它是一個有點亂 。我喜歡這一點,但你可以選擇:

string[] arSearchString = searchString.Split(',', ' ', ';'); 
var codes = CodeList 
    .Where(c => arSearchString 
     .All(val => c.Description.ToUpperInvariant().StartsWith(val.ToUpperInvariant()) 
      || c.Description.ToUpperInvariant().Contains(" " + val.ToUpperInvariant()))) 
+0

怎麼做,如果第一個沒有返回。非常像你擁有它。但是我只想返回描述字段包含所有這些詞的記錄。 – Adam

+0

@Adam更新。確保你的外殼正確。因爲在你的代碼中搜索「貓狗」不會因爲大寫字母匹配「貓狗」。 – mattytommo

+0

出於好奇,這裏是這個源? _USE ToUpper的作爲對字符串comparisons_ –

1

查詢將是大小寫敏感的,所以,在你的榜樣,你不會得到任何結果,只是因爲你搜索cat但不匹配Cat。嘗試在任何其他搜索兩種搜索字符串和比較轉化爲.ToUpper().ToLower()