2015-09-28 4 views
0

J'ai deux tables (listes): les clients et les ventes qui ont une relation un-à-plusieurs. J'essaye de créer un automap qui résulte en une liste remplie avec CustomerSalesDto. Pour chaque objet de vente, un nouveau CustomerSalesDto doit être créé avec les informations de vente et certaines des informations du client qui a effectué la vente. Est-ce que cela peut être fait avec Automapping et comment j'accomplirais ceci?La carte 2 répertorie dans une liste de DTO en utilisant AutoMapper

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

Si 'Sale' avait une propriété de type' Customer' entièrement remplie, alors oui, cela serait possible. – Ric

+0

Tout travail autour si le type reste comme un int? J'utilise un framework qui injecte automatiquement l'identifiant du client dans la base de données lorsqu'il fait la vente (pas l'objet). – Sam

+0

Utilisez-vous framework-entity ou faites-vous cela manuellement? comment peupler un objet 'Sale'? – Ric

Répondre

0

Vous pouvez faire quelque chose comme ceci:

d'abord créer une carte Tuple<Sale, Customer>-CustomerSalesDto comme ceci:

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

Ensuite, vous pouvez créer une méthode pour correspondre à chaque vente avec le client correspondant puis utilisez AutoMapper pour créer une liste d'objets CustomerSalesDto comme ceci:

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