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

Searching and splitting database values with search terms and querying using Linq

我想弄清楚如何执行搜索,将我的搜索词中的一个词映射到数据库中存储在一组词(段落)中的词。

这工作得很好,除了它还 returns 结果与包含中的字母而不是完全匹配,这正是我想要的。我尝试了一些变体,但最好是找人来阐明这一点。非常感谢任何帮助!

所以如果我传入 "the" 它将 return:

房子有...
Another屋(这个应该不会return)

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

此致,

特兹

尝试像这样使用 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();

如果您想要完整的单词,您始终可以在搜索词的两边包含空格,如下所示:

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

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