Запрос LINQ с использованием AutoMapper и параметров automapperC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Запрос LINQ с использованием AutoMapper и параметров automapper

Сообщение Anonymous »

Проблема, с которой я столкнулся, заключается в следующем: у меня есть Resolver, который позволяет получить цену текущего измерения моего текущего продукта. Но в моем Resolver я передаю словарь context.Items, я передаю пару ключ-значение следующим образом: «Продукт»: ProductObj. Мне нужно передать это, чтобы получить цену для текущего измерения. Этот преобразователь используется в моем автосопоставителе , который сопоставляет Dimensiuni с DimensiuniDto. Я пишу запрос, чтобы получить продукты, перечисленные в ProductsListingForUsers dto, из таблицы Produse. Ошибка, с которой я сталкиваюсь, заключается в том, что строка opt => opt.Items["Product"].Add(product) не может быть переведена в SQL, но мне действительно нужно использовать этот автосопоставитель, чтобы получить цена за измерение.
Это мой запрос:

Код: Выделить всё

public async Task GetProductsForUsers(int? pageNumber)
{
var productsRepository = _unitOfWork.Repository();

var upcomingProducts = productsRepository
.GetSimpleQueryable();

var takePaginatedProducts = await upcomingProducts
.Skip(pageNumber ?? 0 * PageSize)
.Take(PageSize)
.Select(product => new ProductsListingForUsers
{
CodProdusDto = product.CodProdus,
NumeProdusDto = product.NumeProdus!,
TipulProdusuluiDto = product.TipulProdusului,
PretBazaDto = product.PretDeBaza,
PretBazaRedusDto = product.PretDeBazaRedus,
DimensiuniProduseDto = product.PProduseCuDimensiuni!
.Select(dimensiune => _mapper.Map(dimensiune.PdDimensiune ,
opt => opt.Items.Add("Product" , product))
).ToList(),
CuloriProdusDto = product.PProduseCuCulori!
.Select(culori => new CuloriDto
{
NumeCuloareDto = culori.Culoare.NumeCuloare,
CodCuloareDto = culori.Culoare.CodCuloare.CodCuloare!,
JustAdded = false,
ImaginiProdusDto = culori.ImagProduseCuCulori!
.Select(image =>  new ImagesDto
{
CaleImagineDto = image.CaleImagine!,
FisierInBucketDto = image.FisierInBucket,
PresignedUrl = null,
JustAdded = false,
IdProdusCuCuloareDto = 0
}).ToList()
})
.ToList()
}).ToListAsync();

foreach (var product in takePaginatedProducts)
{
foreach (var color in product.CuloriProdusDto)
{
if (color.ImaginiProdusDto.IsNullOrEmpty()) continue;
foreach (var image in color.ImaginiProdusDto!)
{
image.PresignedUrl = await _bucketAcces.GenerateUrl(image.CaleImagineDto, image.FisierInBucketDto);
}

}
}

return takePaginatedProducts;
}
Это преобразователь

Код: Выделить всё

using AutoMapper;
using E_Commerce_BackEnd.Models.DTO.ProduseDtos.ProductOptionsDto;
using E_Commerce_BackEnd.Models.ProductRelatedModels;
using E_Commerce_BackEnd.UnitOfWork;

namespace E_Commerce_BackEnd.Services.Helpers.Resolvers;

public class DimensionPriceResolver : IValueResolver
{
private readonly IUnitOfWork _unitOfWork;

public DimensionPriceResolver(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}

public decimal Resolve(Dimensiuni source, DimensiuniDto destination, decimal destMember, ResolutionContext context)
{
var dimensionOnProductRepository = _unitOfWork.Repository();

if (context.Items["Product"] is not Produse product)
{
// Handle case when the product is not available
return 0;
}

// Find the price for the dimension and product combination
var findPriceForTheDimension = dimensionOnProductRepository
.FindQueryable(pd => pd.IdDimensiune == source.IdDimensiune && pd.IdProdus == product.IdProdus)
.FirstOrDefault();

// Return the price if found, or default to 0
return findPriceForTheDimension?.Pret ?? 0;
}
}

Это картограф

Код: Выделить всё

 CreateMap()
.ForMember(dest => dest.RecomandarePat, opt => opt.MapFrom(src => src.RecomandarePat))
.ForMember(dest => dest.LungimeDto, opt => opt.MapFrom(src =>  src.Lungime))
.ForMember(dest => dest.LatimeDto, opt => opt.MapFrom(src => src.Latime))
.ForMember(dest => dest.PretDto, opt =>
opt.MapFrom())
.ForMember(dest => dest.PretRedusDto, opt =>
opt.MapFrom());
Это таблица соединений между Produse и Dimensiuni

Код: Выделить всё

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace E_Commerce_BackEnd.Models.ProductRelatedModels;

public class ProduseCuDimensiuni
{

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!;

}
ProductListingForUser dto:

Код: Выделить всё

using E_Commerce_BackEnd.Models.DTO.ProduseDtos.ProductOptionsDto;

namespace E_Commerce_BackEnd.Models.DTO.ProduseDtos.ProductsListingForUsers;

public class ProductsListingForUsers
{
public string CodProdusDto { get; init; } = null!;
public string NumeProdusDto { get; init; } = null!;
public string TipulProdusuluiDto { get; init; } = null!;
public decimal PretBazaDto { get; init; }
public decimal PretBazaRedusDto { get; init; }
public IList? DimensiuniProduseDto { get; init; } = [];
public IList CuloriProdusDto { get; init; } = [];
}
Таблица Dimensiuni

Код: Выделить всё


using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using E_Commerce_BackEnd.Models.OrderRelatedModels;

namespace E_Commerce_BackEnd.Models.ProductRelatedModels;

public class Dimensiuni
{

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; }

public ICollection? DProduseCuDimensiuni { get; }
public ICollection? DAsociereSeturi { get; }
public ICollection? DProduseCuComenzi { get; }

public Dimensiuni()
{

}

public Dimensiuni(string lungime, string latime,string? recomandarePat ,ICollection? dProduseCuDimensiuni)
{
Lungime = lungime;
Latime = latime;
RecomandarePat = recomandarePat;
DProduseCuDimensiuni = dProduseCuDimensiuni == null ? [] : new HashSet(dProduseCuDimensiuni);
}

}
Один из способов — повторить итерацию и выполнить сопоставление. Я действительно этого не хочу. Есть ли другой способ? Пожалуйста, если я забыл что-то добавить, оставьте комментарий, и я обновлю публикацию.


Подробнее здесь: https://stackoverflow.com/questions/791 ... automapper
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»