我遇到错误
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
,但工作正常,但这不是我想的解决方案。
答案 0 :(得分:1)
查询结果的区分大小写由Collation属性定义。可以在各个级别定义排序规则。
在实例安装期间设置服务器的排序规则。在所有其他级别,如果未定义排序规则,则考虑更高级别的默认值。要检查服务器的当前排序规则,我们可以运行以下查询:
SELECT Serverproperty('COLLATION')
如果结果看起来像“SQL_Latin1_General_CP1_CI_AS”
,则不区分大小写。
原因在于排序规则中,“ CI”表示排序规则不区分大小写。如果存在“ CS”,则排序规则将区分大小写。
如果您在归类中找到CI,则查询将生成忽略大小写的结果。无需在“ StartsWith()”方法中再次指定它。
在这篇精彩的文章中可以找到它,它更详细地说明了排序规则:
答案 1 :(得分:0)
尽管我同意Linq to SQL
的不区分大小写,但是实际问题似乎与EF核心对Linq
的查询评估有关。
一般来说,您必须研究Client vs. Server Evaluation
。
Entity Framework Core尝试尽可能多地评估服务器上的查询。在某些情况下,可以将顶级客户端投影评估到客户端,但是由于性能问题,Entity Framework Core会阻止此类客户端评估并抛出运行时异常。
如果您的要求遵循以下两个规则,您仍然可以按原样运行,并进行客户端评估:
出于演示目的,我使用了以下示例代码,并使用了AsEnumerable()
,其中Values是我的案例中的Dbset
:
var orders = _context.Values.AsEnumerable()
.Where(x => x.Name.StartsWith("S", System.StringComparison.OrdinalIgnoreCase))
.OrderBy(n => n.Name)
.ToList();
由于EF核心始终在服务器端运行查询,因此请始终确保您正在重写查询,以便EF可以尽可能在服务器端运行查询!