我已经为此苦苦挣扎了四天,但根本没有任何进展。有一个查询,在更新到 EF Core 3.1 之前运行良好:
var equipments = await this.DbContext.ServContrObjStructEquipment
.AsNoTracking()
.Where(e => e.ServContrObjStruct.ServContrObjStructParent.ServContrObjStructParent.Objectuuid == sectionGuid)
.Where(e => e.ServContrObjStructPlanEquipment.Select(x => x.PkServContrObjStructPlanEquipment).Contains(
e.ServContrObjStructPlanEquipment.OrderByDescending(x => x.ServContrObjStructPlanVers.ActiveUntil ?? DateTime.MaxValue).ThenByDescending(x => x.ServContrObjStructPlanVers.ActiveFrom).ThenByDescending(x => x.ActiveFrom).Select(x => x.PkServContrObjStructPlanEquipment).FirstOrDefault()
))
Run Code Online (Sandbox Code Playgroud)
现在它向我抛出一个异常,上面写着:
活动直到 ?? 12/31/9999 11:59:59 PM) .ThenByDescending(x => x.ServContrObjStructPlanVers.ActiveFrom) .ThenByDescending(x => x.ActiveFrom) .Select(x => x.PkServContrObjStructPlanEquipment()) .First无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。看 或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。看 或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。看 https://go.microsoft.com/fwlink/?linkid=2101038了解更多信息。
我知道 EF Core 3.0-3.1 有重大更改,并且客户端评估现在在顶级执行Select()。虽然我宁愿避免这样做,我已经打过电话所有的ToList(),AsEnumerable()等等,使其工作,但它也没有帮助:查询是复杂的,多层次的,因此调用ToList()在任何时候任何中断,或不获取相关记录(我猜是因为延迟加载),然后进一步执行查询需要这些记录。
我还尝试将查询拆分为单独的查询,以查看那里发生了什么,如下所示:
var …Run Code Online (Sandbox Code Playgroud)