Сопоставьте linq или запрос EF с ViewModel с помощью automapper - PullRequest
0 голосов
/ 04 августа 2020

Я использую Visual Studio 2019 и. net core 3.1. У меня есть ViewModel, чтобы показывать на представлениях регионы с их страной, названием страны, а не идентификатором, внешним ключом. В стране несколько регионов.

Я пробовал использовать linq и запрос EF, но не могу получить правильное отображение.

public IActionResult Index()
{            
    var data = (from r in _context.CustomerRegions
                join c in _context.CustomerCountries
                on r.IdCustomerCountry equals c.IdCustomerCountry
                select new
                {
                    r.IdCustomerRegion,
                    r.CustomerRegion,
                    c.IdCustomerCountry,
                    c.CustomerCountryName   
                }).OrderBy(m => m.CustomerCountryName);            

    var data2 = _context.CustomerRegions
        .Include("CustomerContry.CustomerCountryName").FirstOrDefault();

    List<CustomerCountryRegionVM> regionsWithCountries = _mapper
        .Map<List<CustomerRegions>, List<CustomerCountryRegionVM>>(data2);

    ...
}   

data2. Вы не можете преобразовать из CustomerRegions в Generi c list данные CustomerCountryRegionVM

. Невозможно преобразовать из Order Iqueryable в generi c list

Класс сопоставления:

CreateMap<CustomerCountryRegionVM, CustomerRegions>();
CreateMap<CustomerRegions, CustomerCountryRegionVM>()
    .ForMember(dest => dest.CustomerCountryName, opt => 
        opt.MapFrom(src => src.CustomerCountry));

Модель просмотра:

public class CustomerCountryRegionVM
{
    public int IdCustomerRegion { get; set; }

    public string CustomerRegion { get; set; }

    public int IdCustomerCountry { get; set; }        
    
    public string CustomerCountryName { get; set; }
}

Модель:

public class CustomerRegions
{
    [Key]
    public int IdCustomerRegion { get; set; }

    [StringLength(50, ErrorMessage = "Longitud máxima para la región: 50")]
    public string CustomerRegion { get; set; }

    [ForeignKey("IdCustomerCountry")]
    public int IdCustomerCountry { get; set; }
    public CustomerCountries CustomerCountry { get; set; }
    
    public ICollection<CustomerCities> CustomerCities { get; set; }
}

**************************** обновление ************** **

    var configuration = new MapperConfiguration(cfg => cfg.CreateMap<CustomerCountries, CustomerCountryRegionVM>()
.ForMember(dto => dto.CustomerRegion, conf => conf.MapFrom(ol => ol.CustomerRegions))); 
//I can´t see the next field on the intellicense
    
    public List<CustomerCountryRegionVM> GetLinesForOrder(int orderId)
            {
                using (var context = new orderEntities())
                {
                    return context.OrderLines.Where(ol => ol.OrderId == orderId)
                             .ProjectTo<CustomerCountryRegionVM>(configuration).ToList();
                }
            }

1 Ответ

1 голос
/ 21 августа 2020

Через много дней я нашел решение

CreateMap<CustomerRegions, CustomerCountryRegionVM>()

                .ForMember(x => x.CustomerCountryName, opt => opt.MapFrom(z => z.CustomerCountry.CustomerCountryName));

На контроллере

var customerRegions = await _context.CustomerRegions
                .Include(c=>c.CustomerCountry)
                .ToListAsync();


List<CustomerCountryRegionVM> regions = _mapper.Map<List<CustomerRegions>,
                                                    List<CustomerCountryRegionVM>>(customerRegions);
...