使用 LINQ Projection 获取深度嵌套的属性

问题描述 投票:0回答:1
我得到的日志:

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
问题描述:

我正在尝试编写一个查询来获取一些订单详细信息及其产品(具有颜色、尺寸等)。我正在使用

projection

,但我需要访问一些深层嵌套的属性才能获取每个 
price
dimension

更新:这是我从连接表中获取所有数据的地方

var allProductsWithDimensions = await productsOnDimensionsRepository.GetAllAsync();
这是我写的查询:

var allProductsOnCurrentOrder = await productsOnOrdersRepository .FindQueryable(pc => pc.IdComanda == order.IdComandaDto) .Select(pc => new ProductsOnOrdersDto { IdProdusDto = pc.Produs.IdProdus, CodProdusDto = pc.Produs.CodProdus, NumeProdusDto = pc.Produs.NumeProdus!, PretBazaProdusDto = pc.Produs.PretDeBaza, NumeProducatorDto = pc.Produs.Producator == null ? null : pc.Produs.Producator.NumeProducator, TipulProdusuluiDto = pc.Produs.TipulProdusului, NumeSetDto = pc.Set == null ? null : pc.Set.NumeSet, PretSetDto = pc.Set == null ? null : pc.Set.PretSet, PretRedusSetDto = pc.Set == null ? null : pc.Set.PretRedusSet, NumeCuloareDto = pc.PcCuloare.NumeCuloare, CodCuloareDto = pc.PcCuloare.CodCuloare.CodCuloare!, LungimeDto = pc.PcDimensiune == null ? null : pc.PcDimensiune.Lungime, LatimeDto = pc.PcDimensiune == null ? null : pc.PcDimensiune.Latime, RecomandarePatDto = pc.PcDimensiune == null ? null : pc.PcDimensiune.RecomandarePat, 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(), PerdeaEstePerecheDto = pc.PcDimensiune == null ? null : pc.PcDimensiune.PerdeaEstePereche, TipGalerieCusaturaDto = pc.PcManopera == null ? null : pc.PcManopera.TipGalerieLaManopera.NumeTipGalerie, PretTipGalerieCusaturaDto = pc.PcManopera == null ? null : pc.PcManopera.TipGalerieLaManopera.PretTipGalerie, TipLinieCusaturaDto = pc.PcManopera == null ? null : pc.PcManopera.TipLinieLaManopera.NumeTipLinie, PretTipLinieCusaturaDto = pc.PcManopera == null ? null : pc.PcManopera.TipLinieLaManopera.PretPeTipLinie, InelePrindereDto = pc.PcManopera == null ? null : pc.PcManopera.InelPrindereLaManopera!.CuloareInel, PretInelPrindereDto = pc.PcManopera == null ? null : pc.PcManopera.InelPrindereLaManopera!.PretPerMetruInele, MaterialDto = pc.PcManopera == null ? null : pc.PcManopera.MaterialLaManopere.NumeMaterial, PretMaterialDto = pc.PcManopera == null ? null : pc.PcManopera.MaterialLaManopere.PretMaterial, }) .ToListAsync();
问题出现在这里:

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:

public class ProduseCuComenzi { // Attributes [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int IdProduseCuComenzi { get; set; } public int NrBucati { get; set; } // Fk public int? IdSet { get; set; } public Seturi? Set { get; set; } public int IdProdus { get; set; } public Produse Produs { get; set; } = null!; public int IdComanda { get; set; } public Comenzi Comanda { get; set; } = null!; public int IdCuloare { get; set; } public Culori PcCuloare { get; set; } = null!; public int? IdDimensiune { get; set; } public Dimensiuni? PcDimensiune { get; set; } public int? IdManopera { get; set; } public Manopere? PcManopera { get; set; } }
这是维度类:

public class Dimensiuni { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int IdDimensiune { get; init; } [StringLength(4)] public string Lungime { get; init; } = null!; [StringLength(4)] public string Latime { get; init; } = null!; public bool? PerdeaEstePereche { get; set; } [StringLength(15)] public string? RecomandarePat { get; set; } // navigation props public ICollection<ProduseCuDimensiuni>? DProduseCuDimensiuni { get; } public ICollection<AsociereSeturi>? DAsociereSeturi { get; } public ICollection<ProduseCuComenzi>? DProduseCuComenzi { get; }
这是 ProduseCuDimensiuni 的连接表,其中我有价格和折扣价格:

public class ProduseCuDimensiuni { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int IdProdusCuDimensiune { get; init; } // Foreign Keys public decimal Pret { get; set; } public decimal PretRedus { get; set; } public int? IdDimensiune { get; set; } public Dimensiuni? PdDimensiune { get; set; } public int IdProdus { get; set; } public Produse PdProduse { get; set; } = null!;}
如何获取 Pret 和 PretRedus 并避免错误?我需要在 ProduseCuDimensiuni 和 ProduseCuComenzi 之间使用 JOIN 吗?

最终更新!!!

解决方案(有点矫枉过正,但我找不到其他东西)

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,

Dimensiuni

 中有一个与 
ProduseCuDimensiuni
 相关的导航道具。用它来获取价格。

c# entity-framework linq
1个回答
0
投票
解决方案:

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,
在 Dimensiuni 中有一个与 ProduseCuDimensiuni 相关的导航道具。用它来获取价格。

© www.soinside.com 2019 - 2024. All rights reserved.