2015-02-10 153 views
0

我想弄清楚如何進行搜索,將單詞從我的搜索詞映射到存儲在單詞集(段)中的單詞數據庫。搜索和拆分數據庫值的搜索條件和查詢使用Linq

這個工作幾乎可以,除了它還返回包含在Contain中的字母的結果而不是完全匹配,這完全是我想要的。我嘗試了一些變化,但理想地尋找某人在這方面闡明一些光。任何幫助是極大的讚賞!

所以,如果我傳遞 「中的」 將返回:

房子有...
[R房子(這不應該返回)

string[] seperator = { " " }; 
string[] filteredSearchTerms = searchTerm.Split(seperator, StringSplitOptions.None); 

    var entities = new Entity(); 
    List<dto> dto = (from t in entities.tbl 
        where 
        filteredSearchTerms.Any(v => t.Description.Contains(v)) 
        select new dto 
        { 
         description = t.Description 
        }).Take(10).ToList(); 

問候,

Tez

回答

0

嘗試使用克Regex這樣的:

string[] seperator = { " " }; 
string[] filteredSearchTerms = searchTerm.Split(seperator, StringSplitOptions.None); 

    var entities = new Entity(); 
    List<dto> dto = (from t in entities.tbl 
        where 
        filteredSearchTerms.Any(v => System.Text.RegularExpressions.Regex.IsMatch(t, string.Format(@"\b{0}\b", v))) 
        select new dto 
        { 
         description = t.Description 
        }).Take(10).ToList(); 

該正則表達式使用單詞定界符\b整個單詞相匹配。有關更多信息,請參閱this

編輯

由於Regex不Linq的支持,以實體,實現這一目標的一個方法是使用原始查詢,然後使用LINQ到這樣的對象客戶端過濾它們第一次提取您的數據:

List<dto> dto = (from t in entities.tbl 
       where 
       filteredSearchTerms.Any(v => t.Description.Contains(v)) 
       select new dto 
       { 
        description = t.Description 
       }).AsEnumerable() 
        .Where(obj => filteredSearchTerms.Any(v => System.Text.RegularExpressions.Regex.IsMatch(obj, string.Format(@"\b{0}\b", v)))) 
        .Take(10).ToList(); 
+0

只是看着你的答案,此刻我收到一個錯誤。 IsMatch不支持linq到實體布爾。 – 2015-02-10 21:57:50

+0

@TezWingfield看看這些SO問題:http://stackoverflow.com/questions/5720987/how-to-simulate-regular-expressions-in-linq-to-sql和http://stackoverflow.com/questions/3493501/using-match-in-a-linq-statement – 2015-02-10 22:02:46

+0

@TezWingfield查看編輯答案。 – 2015-02-10 22:19:35

0

如果你想整個單詞,你可以隨時包括你這樣的搜索詞的兩側空間:

var filteredSearchTerms = searchTerm.Split(' ').Select(x => " " + x + " "); 

由於擴展方法Any()接受IEnumerable<T>,所以我沒有將它推送到數組。 Select()將被評估爲當需要時並且由於您使用的是Any(),它甚至不需要枚舉整個集合,這比將結果推送到數組(使用ToArray())更快。

+0

這隻有在詞語前後有空格時纔有效。如果我有一個以「the」開頭的描述,它將不會返回。 – 2015-02-10 21:55:42

+0

這絕對是真的。如果是我,我會列出要忽略的單詞(a,the,in等),而不是將這些單詞用作搜索詞。那麼就不需要偏離原來的解決方案,並且不會遇到您用我的解決方案指出的問題。 – 2015-02-10 22:17:22