无法在 EF 核心 3.1 查询中使用 .AddDays

mra*_*api 5 entity-framework-core .net-core

我正在尝试将我的项目从 .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 || h.DATAI <= __AddDays_1 && 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()
    );
    }
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助

Iva*_*oev 6

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

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

在这种特定情况下,不支持的表达式是类型matchesConvert.ToInt32(r.NRZILE)的表达式。NRZFILEint?Convert.ToInt32(object)

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

例如替换所有出现的

Convert.ToInt32(r.NRZILE)
Run Code Online (Sandbox Code Playgroud)

(int)r.NRZILE
Run Code Online (Sandbox Code Playgroud)

或(在上下文中DateAdd

r.NRZILE ?? 0
Run Code Online (Sandbox Code Playgroud)

问题就会得到解决。