Сглаживание отношений «многие ко многим» с использованием AutoMapper - PullRequest
0 голосов
/ 08 февраля 2020

Я использую EF Core, и у меня есть взаимосвязь «многие ко многим» между двумя таблицами.

 public class Sale
    {
        public int Id { get; set; }
        public DateTime Date { get; set; }
        public double Total { get; set; }
        public List<SalePaymentMethod> SalePaymentMethods { get; set; }
    }

Таблица соединений:

    public class SalePaymentMethod
{
    public int DefferedPaymentCount { get; set; }
    public int SaleId { get; set; }
    public Sale Sale { get; set; }
    public double Amount { get; set; }
    public int PaymentMethodId { get; set; }
    public PaymentMethod PaymentMethod { get; set; }
}

Другая таблица отношения:

public class PaymentMethod
{
    public int Id { get; set; }
    public string PaymentName { get; set; }
    public bool PaymentType { get; set; }
    public List<SalePaymentMethod> SalePaymentMethods { get; set; }

}

Могу ли я получить плоский объект как следующий, используя AutoMapper?

public class SaleUserBranchProductsDTO
{
    public int Id { get; set; }
    public DateTime Date { get; set; }
    public double Total { get; set; }
    public List<PaymentMethodDto> PaymentMethods { get; set; }
}

Где PaymentMethodDto:

public class PaymentMethodDto
{
    public string PaymentName { get; set; }
    public bool PaymentType { get; set; }
    public int DefferedPaymentCount { get; set; }
    public double Amount { get; set; }
}

Мой вопрос может быть, что я хочу выполните другое отображение в основном отображении.

1 Ответ

0 голосов
/ 08 февраля 2020

Я понял, как ее решить.

Создать профиль для сопоставления SalePaymentMethod с PaymentMethodDto

    public class PaymentMethodProfile : Profile
{
    public PaymentMethodProfile()
    {
        CreateMap<SalePaymentMethod, PaymentMethodDto>()
             .ForMember(q => q.Amount, opt => opt.MapFrom(s => s.Amount))
             .ForMember(q => q.DefferedPaymentCount, opt => opt.MapFrom(s => s.DefferedPaymentCount))
             .ForMember(q => q.PaymentName, opt => opt.MapFrom(s => s.PaymentMethod.PaymentName))
             .ForMember(q => q.PaymentType, opt => opt.MapFrom(s => s.PaymentMethod.PaymentType));


    }
}

Создать другой профиль для сопоставления формы Sale с SaleUserBranchProductsDTO

public SaleUserBranchProductsProfile()
{
    CreateMap<Sale, SaleUserBranchProductsDTO>()
        .ForMember(q => q.Id, opt => opt.MapFrom(s => s.Id))
        .ForMember(q => q.Date, opt => opt.MapFrom(s => s.Date))
        .ForMember(q => q.Total, opt => opt.MapFrom(s => s.Total))
        //Here is the magic
        .ForMember(q=> q.PaymentMethoddtos, opt => opt.MapFrom(s => s.SalePaymentMethods));
}

}

Затем используйте его так:

 _mapper.ProjectTo<SaleUserBranchProductsDTO>(_context.Sales.Where(wh => wh.UserId == UserId)).ToList();
...