按 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))