小编Yur*_*iuk的帖子

无法翻译 LINQ 表达式。以可翻译的形式重写查询,或切换到客户端评估 EF Core 3.1

我已经为此苦苦挣扎了四天,但根本没有任何进展。有一个查询,在更新到 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)

c# linq entity-framework asp.net-core ef-core-3.1

9
推荐指数
1
解决办法
2万
查看次数

标签 统计

asp.net-core ×1

c# ×1

ef-core-3.1 ×1

entity-framework ×1

linq ×1