我正在试图弄清楚如何执行搜索,将搜索词中的单词映射到数据库中存储在单词(段落)中的单词。
这非常正常,除了它还返回包含在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
答案 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())。