使用搜索词搜索和拆分数据库值并使用 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())。
我想弄清楚如何执行搜索,将我的搜索词中的一个词映射到数据库中存储在一组词(段落)中的词。
这工作得很好,除了它还 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())。