使用 Dapper.net 传递全文搜索参数
Passing a full-text search parameter using Dapper.net
考虑这个在 Keywords
字段上使用全文搜索的简单查询:
DECLARE @searchTerm VARCHAR(500) = 'painted'
SELECT * FROM StockCatalogueItems
WHERE (CONTAINS(KeyWords, @searchTerm))
这按预期工作,但我需要使用 Dapper.net 参数化查询来执行相同的操作。使用存储过程时,我创建了这样的全文参数:"\"painted*\""
但是使用相同的方法,这在使用 dapper 时不起作用。没有返回结果。这是查询中我使用参数的行:
AND (CONTAINS(KeyWords, @search))
它像这样传递给查询:
return _context.Database.Connection.Query<StockProfileMatrix>(basequery, new
{
search = searchTerm
}
我只能假设 dapper 正在以某种方式清理字符串,也许删除引号?
有什么想法吗?
这对我有用。然而,我正在研究的技术堆栈是 .net core RTM
和 "Dapper": "1.50.0-rc3"
、
_dbConnection.QueryAsync<Guid>(@"select br.Id from Brand br where CONTAINS(br.Text,@Name)",new {Name = $"\"*{name}*\""}))
为了完整起见,我会回答这个问题。查询语法是正确的,但创建全文参数的方式显然不正确。我创建了一个格式化参数的扩展方法:
public static string ToFullText(this string str)
{
string searchTerm = null;
if (!string.IsNullOrEmpty(str))
{
string[] keywords = str.Trim().Split(null);
foreach (var keyword in keywords)
{
searchTerm += string.Format("\"{0}*\" AND ", keyword);
}
if (searchTerm != null)
searchTerm = searchTerm.Substring(0, searchTerm.LastIndexOf(" AND "));
}
return searchTerm;
}
然后我在将参数传递给 dapper 查询时调用该方法:
_context.Database.Connection.Query<dynamic>(query, new
{
search = filter.SearchTerm.ToFullText()
});
考虑这个在 Keywords
字段上使用全文搜索的简单查询:
DECLARE @searchTerm VARCHAR(500) = 'painted'
SELECT * FROM StockCatalogueItems
WHERE (CONTAINS(KeyWords, @searchTerm))
这按预期工作,但我需要使用 Dapper.net 参数化查询来执行相同的操作。使用存储过程时,我创建了这样的全文参数:"\"painted*\""
但是使用相同的方法,这在使用 dapper 时不起作用。没有返回结果。这是查询中我使用参数的行:
AND (CONTAINS(KeyWords, @search))
它像这样传递给查询:
return _context.Database.Connection.Query<StockProfileMatrix>(basequery, new
{
search = searchTerm
}
我只能假设 dapper 正在以某种方式清理字符串,也许删除引号?
有什么想法吗?
这对我有用。然而,我正在研究的技术堆栈是 .net core RTM
和 "Dapper": "1.50.0-rc3"
、
_dbConnection.QueryAsync<Guid>(@"select br.Id from Brand br where CONTAINS(br.Text,@Name)",new {Name = $"\"*{name}*\""}))
为了完整起见,我会回答这个问题。查询语法是正确的,但创建全文参数的方式显然不正确。我创建了一个格式化参数的扩展方法:
public static string ToFullText(this string str)
{
string searchTerm = null;
if (!string.IsNullOrEmpty(str))
{
string[] keywords = str.Trim().Split(null);
foreach (var keyword in keywords)
{
searchTerm += string.Format("\"{0}*\" AND ", keyword);
}
if (searchTerm != null)
searchTerm = searchTerm.Substring(0, searchTerm.LastIndexOf(" AND "));
}
return searchTerm;
}
然后我在将参数传递给 dapper 查询时调用该方法:
_context.Database.Connection.Query<dynamic>(query, new
{
search = filter.SearchTerm.ToFullText()
});