我正在尝试将解决方案升级到新的 Core Framework 3.0.0。
现在我有一个小问题我不明白。
看一下,这个方法在2.2.6中是没有问题的:
public async Task<IEnumerable<ApplicationUser>> GetBirthdayUsersCurrentMonth()
{
return await ApplicationDbContext.Users
.Where(x => x.Gender != ApplicationUser.GenderTypes.generic)
.Where(x => x.BirthDate.GetValueOrDefault().Month == DateTime.Now.Month)
.Where(x => x.RetireDate == null)
.OrderBy(x => x.BirthDate.GetValueOrDefault())
.ToListAsync();
}
现在在 3.0.0 中我收到一个 Linq 错误,内容如下:
InvalidOperationException:LINQ 表达式 'Where( 源:Where( 源:DbSet,谓词:(a) => (int)a.Gender != 0),谓词:(a) => a.BirthDate.GetValueOrDefault().Month == DateTime.Now.Month)' 无法翻译。以可翻译的形式重写查询,或者通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用来显式切换到客户端计算
当我禁用此行时:
.Where(x => x.BirthDate.GetValueOrDefault().Month == DateTime.Now.Month)
错误消失了,但我当然得到了所有用户。我在这个查询中看不到错误。
这可能是 EF Core 3.0.0 中的一个错误吗?
原因是 EF Core 3 中已禁用隐式客户端评估。
这意味着以前,您的代码没有在服务器上执行 WHERE 子句。相反,EF 将所有行加载到内存中并计算内存中的表达式。
要在升级后解决此问题,首先需要弄清楚 EF 到底无法转换为 SQL 的是什么。我的猜测是打电话给GetValueOrDefault()
,因此尝试这样重写:
.Where(x => x.BirthDate != null && x.BirthDate.Value.Month == DateTime.Now.Month)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)