【问题标题】:DefaultIfEmpty Exception "bug or limitation" with EF CoreEF Core 的 DefaultIfEmpty 异常“错误或限制”
【发布时间】:2020-04-20 16:00:57
【问题描述】:

我尝试执行以下代码:

await _dbContext.Customers.Select(x => x.CustomerNr).DefaultIfEmpty(0).MaxAsync() + 1;

本质上它必须从数据库中获取最高的客户编号并将其加 1。如果客户表是空的,它应该返回 0,我添加 1。为什么它给我以下异常:

编辑: 我正在使用 .NET Core 3.1 和 EF Core 3.0.1(EF Core 3.1.0 的错误相同)

【问题讨论】:

  • 您的 .NET Core 和 EF Core 版本是多少?
  • 我编辑我的问题@V0ldek
  • 这可能看起来是多余的,但是如果你将 ( await ... .MaxAsync() ) + 1 包裹在括号中会发生什么。
  • 同样的错误。对我来说似乎是一个 EF 错误...... EF Core 3.1.0 @ErikPhilips 的同样错误

标签: c# linq lambda entity-framework-core


【解决方案1】:

避免 DefaultIfEmpty 使用默认值重载 - EF Core 查询翻译器不支持。

一般来说,除了左外连接模式之外,还要避免 DefaultIfEmpty 无参数重载,因为虽然它受支持,但 SQL 转换很奇怪。

若要解决在空集上应用 MaxMinAverage 方法的问题,请使用为空集返回 null 的可空重载,并将 null 结果转换为 0(或其他所需魔法值)如果需要的话。

将其应用于您的场景将是这样的(假设CustomerNr 类型为int):

(await _dbContext.Customers.MaxAsync(x => (int?)x.CustomerNr)) ?? 0 + 1; 

【讨论】:

  • 谢谢!奇怪的是,EF Core 不支持 DefaultIfEmpty。对我来说似乎是一个非常基本的功能......
猜你喜欢
  • 2020-11-09
  • 2020-06-13
  • 1970-01-01
  • 2019-05-02
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
  • 1970-01-01
相关资源
最近更新 更多