2015-09-28 5 views
0

У меня есть две таблицы (списки): клиенты и продажи, имеющие отношения «один ко многим». Я пытаюсь создать automap, который приводит к списку, заполненному CustomerSalesDto. Для каждого объекта Продажи должен быть создан новый CustomerSalesDto с информацией о продаже и некоторой информацией от Клиента, который совершил продажу.Карта 2 перечисляет в список DTO с помощью AutoMapper

Можно ли это сделать с помощью Automapping и как бы это сделать?

public class Customer 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Email { get; set; } 
} 

public class Sale 
{ 
    public int Id { get; set; } 
    public double Price { get; set; } 
    public DateTime Date { get; set; } 
    public int CustomarId { get; set;} // Id from Customer who made a sale. 
} 

public class CustomerSalesDto 
{ 
    public double Price { get; set; } // from Sale 
    public DateTime Date { get; set; } // from Sale 
    public string Name { get; set; } // from Customer 
    public string Email { get; set; } // from Customer 
} 
+0

Если у 'Sale' было свойство типа' Customer', которое было полностью заполнено, то да было бы возможно. – Ric

+0

Любая работа вокруг, если тип остается как int? Я использую фреймворк, который автоматически вводит идентификатор клиента в базу данных, когда он делает продажу (а не объект). – Sam

+0

Вы используете сущность-каркас или делаете это вручную? как вы заполняете объект 'Sale'? – Ric

ответ

0

Вы можете сделать что-то вроде этого:

Сначала создать карту из Tuple<Sale, Customer> в CustomerSalesDto так:

AutoMapper.Mapper.CreateMap<Tuple<Sale, Customer>, CustomerSalesDto>() 
    .ForMember(t => t.Name, m => m.MapFrom(f => f.Item2.Name)) 
    .ForMember(t => t.Email, m => m.MapFrom(f => f.Item2.Email)) 
    .ForMember(t => t.Date, m => m.MapFrom(f => f.Item1.Date)) 
    .ForMember(t => t.Price, m => m.MapFrom(f => f.Item1.Price)); 

Затем вы можете создать метод, чтобы соответствовать каждой продажи с соответствующим клиентом а затем используйте AutoMapper для создания списка CustomerSalesDto объектов:

public List<CustomerSalesDto> Convert(List<Sale> sales, List<Customer> customers) 
{ 
    List<CustomerSalesDto> result = new List<CustomerSalesDto>(); 

    Dictionary<int, Customer> customer_dictionary = customers.ToDictionary(x => x.Id); //This is done to speed things up 

    foreach (Sale sale in sales) 
    { 
     if(!customer_dictionary.ContainsKey(sale.CustomarId)) 
      throw new Exception("Could not find the customer"); 

     Customer customer = customer_dictionary[sale.CustomarId]; 

     result.Add(AutoMapper.Mapper.Map<CustomerSalesDto>(new Tuple<Sale, Customer>(sale , customer))); 
    } 

    return result; 
} 
Смежные вопросы