有没有办法在linq C#的Where子句的startsWith中添加'System.StringComparison.OrdinalIgnoreCase'

Is there any way to add 'System.StringComparison.OrdinalIgnoreCase' in startsWith in Where clause in linq C#

我收到一个错误

The LINQ expression 'DbSet .Where(t => t.ZipCode.StartsWith( value: __zipCode_0, comparisonType: OrdinalIgnoreCase))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync().

这是我的代码:

await DbSet
     .Where(x => x.ZipCode.StartsWith(zipCode, System.StringComparison.OrdinalIgnoreCase))
     .OrderBy(n => n.ZipCode)
     .ToListAsync(cancellationToken);

有人能帮帮我吗?我已经尝试删除 StringComparison.OrdinalIgnoreCase,它工作正常,但我猜这不是解决方案。

查询结果区分大小写由排序规则定义 属性。可以在不同级别定义排序规则。

  • 服务器等级
  • 数据库级别
  • Table 等级
  • 列级别

服务器的排序规则是在安装实例时设置的。在所有其他级别,如果未定义排序规则,则考虑更高级别的默认值。要检查服务器的当前排序规则,我们可以 运行 以下查询:

SELECT Serverproperty('COLLATION')

如果结果类似于 “SQL_Latin1_General_CP1_CI_AS”,则不区分大小写。

归类中的原因,'CI' 表明归类不区分大小写。如果存在 'CS',则排序规则将区分大小写。

如果您在排序规则中找到 CI,则查询将生成忽略大小写的结果。无需在 'StartsWith()' 方法中再次指定它。

看到这篇更详细地解释排序规则的精彩文章:

Collation in sql server

虽然我同意 Linq to SQL 的不区分大小写,但实际问题似乎与 EF 核心的 Linq 查询评估有关。

总的来说,您必须查看 Client vs. Server Evaluation。 Entity Framework 核心尝试评估服务器上的查询与 possible.There 一样多是一些场景,其中顶级客户端投影可以评估到客户端但由于性能问题 Entity Framework 核心块这样客户端评估并引发 运行time 异常。

如果您的要求遵循以下两条规则,您仍然可以运行毫无例外地进行客户端评估:

  1. 数据量小,无法在客户端进行评估 招致巨大的性能损失。
  2. 正在使用的 LINQ 运算符没有服务器端转换。

出于演示目的,我使用以下示例代码使用 AsEnumerable(),其中值是 Dbset 在我的例子中:

var orders =  _context.Values.AsEnumerable()
              .Where(x => x.Name.StartsWith("S", System.StringComparison.OrdinalIgnoreCase))
              .OrderBy(n => n.Name)
              .ToList();

由于 EF 核心始终 运行 服务器端的查询始终确保您正在重写查询,以便 EF 可以 运行 尽可能多地在服务器端进行查询!