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
相关的导航道具。用它来获取价格。
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 相关的导航道具。用它来获取价格。