You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用LINQ投影获取深层嵌套属性时的EF查询转换错误解决

LINQ查询订单详情及关联产品时的翻译错误解决

错误日志

Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'

最初实现与问题代码

为获取订单详情及关联产品(含颜色、维度等信息),并通过LINQ投影获取各维度对应的Pret(价格)和PretRedus(折扣价),先从关联表获取全量数据:

var allProductsWithDimensions = await productsOnDimensionsRepository.GetAllAsync();

后续在DTO赋值环节触发上述翻译错误,问题代码如下:

PretDto = pc.PcDimensiune == null ? null : (from pcd in allProductsWithDimensions 
                                            where pcd.IdProdus == pc.Produs.IdProdus && pcd.IdDimensiune == pc.PcDimensiune.IdDimensiune 
                                            select pcd.Pret).First(),
PretRedusDto = pc.PcDimensiune == null ? null : (from pcd in allProductsWithDimensions 
                                                 where pcd.IdProdus == pc.Produs.IdProdus && pcd.IdDimensiune == pc.PcDimensiune.IdDimensiune 
                                                 select pcd.PretRedus).First(),

涉及的实体类包括:ProduseCuComenzi(订单产品)、Dimensiuni(维度)、ProduseCuDimensiuni(存储产品维度与价格的关联表)。

解决方法

通过Dimensiuni实体中的导航属性DProduseCuDimensiuni直接关联查询,修改后代码如下:

PretDto = ord.PcDimensiune.DProduseCuDimensiuni!.First(pd => pd.IdDimensiune == ord.PcDimensiune.IdDimensiune && pd.IdProdus == ord.Produs.IdProdus).Pret,
PretRedusDto = ord.PcDimensiune.DProduseCuDimensiuni!.First(pd => pd.IdDimensiune == ord.PcDimensiune.IdDimensiune && pd.IdProdus == ord.Produs.IdProdus).PretRedus,

错误原因

最初的写法在EF Core的LINQ to Entities查询中引用了已加载到内存的allProductsWithDimensions集合,EF无法将这种内存集合与数据库查询的关联逻辑翻译成SQL语句。使用实体导航属性后,EF能正确解析关联关系并生成对应SQL,避免了客户端评估的问题。

内容的提问来源于stack exchange,提问作者Misu Stefan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:21:05