【问题标题】:Can't use .AddDays in EF core 3.1 query无法在 EF 核心 3.1 查询中使用 .AddDays
【发布时间】:2020-02-06 13:22:08
【问题描述】:

我正在尝试将我的项目从 .net core 2.2 迁移到 3.1,以下代码运行良好,但现在出现该错误:

System.InvalidOperationException:LINQ 表达式 'DbSet .Where(h => h.DATAI.AddDays((double)Convert.ToInt32((object)h.NRZILE)) >= __date_0 && h.DATAI.AddDays((double)Convert.ToInt32((object)h.NRZILE)) = __AddDays_1)' 无法翻译。以可翻译的形式重写查询,或显式切换到客户端评估 通过插入对 AsEnumerable()、AsAsyncEnumerable() 的调用, ToList() 或 ToListAsync()。

public async Task<IActionResult> getOp(int day, int month, int year, int daysToShow)
    {
    var date = new DateTime(year, month, day);

    return Ok(await db.HT_REZ
    .Where(r => (r.DATAI.AddDays(Convert.ToInt32(r.NRZILE)) >= date && r.DATAI.AddDays(Convert.ToInt32(r.NRZILE)) < date.AddDays(daysToShow))
     || (r.DATAI <= date.AddDays(daysToShow) &&  r.DATAI.AddDays(Convert.ToInt32(r.NRZILE)) >= date.AddDays(daysToShow))
    )
    .Select(r => new { r.ID,  .... })
    .ToListAsync()
    );
    }

我发现隐式客户端评估已在 EF Core 3 中禁用,我必须在过滤数据之前使用 AsEnumerable,但无法修复上述查询

感谢您的帮助

【问题讨论】:

  • r.DATAI的类型是什么?而r.NRZILE的类型呢?
  • DATAI= DateTime,NRZILE=int?

标签: .net-core entity-framework-core


【解决方案1】:

问题不在于DateTime.AddDays 调用,支持

请注意,异常消息显示了整个 Where 运算符,因此问题(不支持)应该在谓词内的某个其他表达式中。

在这种特定情况下,不支持的是 Convert.ToInt32(r.NRZILE) 表达式,对于 NRZFILE,类型 int? 匹配 Convert.ToInt32(object)

虽然 EF Core 支持 Convert 类方法的子集,但通常您应该通过使用 C# 强制转换或 null 合并运算符来避免它们(从字符串转换除外)。

例如替换所有出现的

Convert.ToInt32(r.NRZILE)

(int)r.NRZILE

或(在DateAdd的上下文中)

r.NRZILE ?? 0

问题就解决了。

【讨论】:

    【解决方案2】:

    您需要使用DbFunctions 扩展方法并考虑不同的方法:尝试计算日期之间的差异(DateDiffDay 方法)。请参阅https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.dbfunctions?view=efcore-3.1

    另外,我认为你不能在表达式中使用Convert,所以如果值已经是数字,就直接使用它们。

    【讨论】:

    • 您需要为Microsoft.EntityFrameworkCore 命名空间添加using 语句。不是EF.Functions
    • 恰恰相反。仅当没有相应的 CLR 方法时,您才应使用 CLR 方法/属性并回退到 DbFunctions 扩展。在这种特殊情况下,DateTime.AddDays 是被“调用”的预期方法。
    • 翻译了吗?如果是,是的,如果不是,那么您必须使用 DbDunctions。
    • 我发现没有 DateDiffDay 甚至添加了“使用 Microsoft.EntityFrameworkCore;”
    • @mrapi:从我发送的文档中可以看出,这是对 DateTime 类型的扩展方法。
    猜你喜欢
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多