有什么办法可以在linq C#

时间:2020-07-10 06:15:16

标签: c# linq .net-core entity-framework-core-3.0

我遇到错误

LINQ表达式'DbSet 哪里(t => t.ZipCode.StartsWith( 值:__ zipCode_0, comparisonType:OrdinalIgnoreCase))'无法翻译。可以以可翻译的形式重写查询,也可以通过插入对AsEnumerable(),AsAsyncEnumerable(),ToList()或ToListAsync()的调用来显式切换到客户端评估。

这是我的代码:

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

有人可以帮助我吗?我曾尝试删除StringComparison.OrdinalIgnoreCase,但工作正常,但这不是我想的解决方案。

2 个答案:

答案 0 :(得分:1)

查询结果的区分大小写由Collat​​ion属性定义。可以在各个级别定义排序规则。

  • 服务器级别
  • 数据库级别
  • 表级别
  • 列级别

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

SELECT Serverproperty('COLLATION')

如果结果看起来像“SQL_Latin1_General_CP1_CI_AS”,则不区分大小写。

原因在于排序规则中,“ CI”表示排序规则不区分大小写。如果存在“ CS”,则排序规则将区分大小写。

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

在这篇精彩的文章中可以找到它,它更详细地说明了排序规则:

Collation in sql server

答案 1 :(得分:0)

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

一般来说,您必须研究Client vs. Server Evaluation。 Entity Framework Core尝试尽可能多地评估服务器上的查询。在某些情况下,可以将顶级客户端投影评估到客户端,但是由于性能问题,Entity Framework Core会阻止此类客户端评估并抛出运行时异常。

如果您的要求遵循以下两个规则,您仍然可以按原样运行,并进行客户端评估:

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

出于演示目的,我使用了以下示例代码,并使用了AsEnumerable(),其中Values是我的案例中的Dbset

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

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