【问题标题】:Order by best match of string column in EF Core按 EF Core 中字符串列的最佳匹配排序
【发布时间】:2022-02-09 16:18:16
【问题描述】:

我正在为我们的 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 Server 作为数据库提供程序

我如何通过查询实现排序,其中名称与 searchTerm 更匹配的用户在列表中排名靠前?

【问题讨论】:

    标签: sql-server entity-framework-core


    【解决方案1】:

    你试过 LIKE 运算符吗?

    你可能会发现这很有用

    Entity framework EF.Functions.Like vs string.Contains

    【讨论】:

      【解决方案2】:

      经过一番搜索,发现了这种从 DB 提供程序导入函数的方法:

      [DbFunction("CHARINDEX", IsBuiltIn = true)]
      public static long CHARINDEX(string substring, string str)
      {
          throw new NotImplementedException();
      }
      

      把它放在用户 dbContext 类中。它将绑定到 SQL Server 中的 CHARINDEX 函数。 https://docs.microsoft.com/en-us/ef/core/querying/user-defined-function-mapping

      然后用它对查询进行排序:

      .sortBy(u => DbContext.CHARINDEX(searchTerm, u.name))
      

      【讨论】:

        猜你喜欢
        • 2013-09-14
        • 1970-01-01
        • 2016-11-12
        • 1970-01-01
        • 2021-10-02
        • 1970-01-01
        • 1970-01-01
        • 2015-07-11
        • 1970-01-01
        相关资源
        最近更新 更多