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,但无法修复上述查询
谢谢你的帮助
问题不在于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)
问题就会得到解决。
| 归档时间: |
|
| 查看次数: |
2287 次 |
| 最近记录: |