按 EF Core 中字符串列的最佳匹配排序
Order by best match of string column in EF Core
我正在为 api 中的用户实施搜索功能。搜索将查询我们的数据库以获取与搜索词匹配的前 N 个用户。我想在“最佳匹配”之后对用户进行排序,以便最相关的用户排在最前面。
我想做的是:
var users = await _dbContext.Users
.IncludeUserData()
.Where(u => u.Name.Contains(searchTerm))
.OrderBy(u => u.Name.IndexOf(searchTerm)) <- This row is not possible
.ToListAsync();
基本上,包含搜索词 early 的名称排在名称包含 late 词的用户之前。
例如
如果 searchTerm 是“Simon”,Simon Carlsson 应该排在 Carl Simonsson 之前
使用 SQL 服务器作为数据库提供者
我如何实现按查询排序,其中名称与 searchTerm 更匹配的用户在列表中排序靠前?
您尝试过 LIKE 运算符吗?
您可能会发现这很有用
经过更多搜索,找到了这种从数据库提供程序导入函数的方法:
[DbFunction("CHARINDEX", IsBuiltIn = true)]
public static long CHARINDEX(string substring, string str)
{
throw new NotImplementedException();
}
将其放入用户 dbContext class。它将绑定到 SQL 服务器中的 CHARINDEX 函数。
https://docs.microsoft.com/en-us/ef/core/querying/user-defined-function-mapping
然后用它来排序查询:
.sortBy(u => DbContext.CHARINDEX(searchTerm, u.name))
我正在为 api 中的用户实施搜索功能。搜索将查询我们的数据库以获取与搜索词匹配的前 N 个用户。我想在“最佳匹配”之后对用户进行排序,以便最相关的用户排在最前面。
我想做的是:
var users = await _dbContext.Users
.IncludeUserData()
.Where(u => u.Name.Contains(searchTerm))
.OrderBy(u => u.Name.IndexOf(searchTerm)) <- This row is not possible
.ToListAsync();
基本上,包含搜索词 early 的名称排在名称包含 late 词的用户之前。
例如 如果 searchTerm 是“Simon”,Simon Carlsson 应该排在 Carl Simonsson 之前
使用 SQL 服务器作为数据库提供者
我如何实现按查询排序,其中名称与 searchTerm 更匹配的用户在列表中排序靠前?
您尝试过 LIKE 运算符吗?
您可能会发现这很有用
经过更多搜索,找到了这种从数据库提供程序导入函数的方法:
[DbFunction("CHARINDEX", IsBuiltIn = true)]
public static long CHARINDEX(string substring, string str)
{
throw new NotImplementedException();
}
将其放入用户 dbContext class。它将绑定到 SQL 服务器中的 CHARINDEX 函数。 https://docs.microsoft.com/en-us/ef/core/querying/user-defined-function-mapping
然后用它来排序查询:
.sortBy(u => DbContext.CHARINDEX(searchTerm, u.name))