使用搜索项搜索和拆分数据库值并使用Linq进行查询

时间:2015-02-10 21:03:48

标签: c# linq-to-entities

我正在试图弄清楚如何执行搜索,将搜索词中的单词映射到数据库中存储在单词(段落)中的单词。

这非常正常,除了它还返回包含在Contain中的字母的结果,而不是完全匹配,这是我想要的理想选择。我尝试了一些变化,但理想情况下寻找某人对此有所了解。非常感谢任何帮助!

所以,如果我传入“the”,它将返回:

房子有...
Ano r House(这不应该返回)

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

2 个答案:

答案 0 :(得分: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

修改

由于Linq to Entities不支持Regex,实现此目的的一种方法是首先使用原始查询获取数据,然后使用Linq to Objects在客户端过滤它们,如下所示:

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();

答案 1 :(得分:0)

如果您想要整个单词,则可以在搜索词的任意一侧包含空格,如下所示:

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

我没有将此推送到数组,因为扩展方法Any()接受IEnumerable<T>。在需要时,将评估,因为您正在使用Select(),因此许多人甚至不需要枚举整个集合,这比将结果推送到数组更快(使用ToArray())。