使用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
相关产品推荐
相关产品推荐

