2015-02-10 72 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