2017-07-26 2 views
0

J'ai deux classesDapper multi Mapping Résultat

public class Customer 
{ 
    public int CustomerId { get; set;} 
    public string CustomerName { get; set; } 
} 

public class Order 
{ 
    public int OrderId { get; set; } 
    public int CustomerId { get; set; }  //BuyerCustomer 
    public int CustomerSecondId { get; set; } //ReceiverCustomer 
    public Customer BuyerCustomer { get; set; } 
    public Customer ReceiverCustomer { get; set; } 
} 

Voici ma requête ressemblera

SELECT a.*, b.*, c.* FROM dbo.PRODUCTS_ORDER a 
INNER JOIN dbo.CUSTOMER b ON a.CustomerId=b.CustomerId 
INNER JOIN dbo.CUSTOMER c ON a.CustomerSecondId=b.CustomerId 

mise en œuvre Dapper ..

 List<Order> order= null; 
order= (List<Order>)dapperconnection.Query<Order, Customer, Customer, Order>(sql, 
           (order, customer1,customer2) => 
           { 
            order.BuyerCustomer = customer1; 
            order.ReceiverCustomer = customer2; 
            return order; 
           }, splitOn: "CustomerId,CustomerSecondId "); 

Le résultat que je reçois est incomplète , seul le RecevierCustomer est renseigné alors que BuyerCustomer ne contient aucune valeur.

Il semble que dapper est confus depuis que j'ai utilisé le CustomerId deux fois dans ma requête. Y a-t-il une solution de contournement sans avoir à modifier ma classe Customer?

Répondre

0

Votre conception de classe et votre requête Dapper posent quelques problèmes.

  • Customer.CustomerName doit être une chaîne
  • Je supprimerais CustomerId et CustomerSecondId de l'ordre. Ils sont redondants. Vous avez les deux Id dans le client.
  • Supprimer CustomerSecondId de Split.

Ci-dessous est un test de travail:

public class Order 
{ 
    public int OrderId { get; set; } 
    public Customer BuyerCustomer { get; set; } 
    public Customer ReceiverCustomer { get; set; } 
} 

public class Customer 
{ 
    public int CustomerId { get; set; } 
    public string CustomerName { get; set; } 
} 


[Test] 
public void TestSplitMany() 
{ 
    using (var conn = new SqlConnection(@"Data Source=.\sqlexpress;Integrated Security=true; Initial Catalog=foo")) 
    { 
     var result = 
      conn.Query<Order, Customer, Customer, Order>(@"select OrderId = 1, CustomerId = 2, CustomerName = 'Jim', CustomerId = 3, CustomerName = 'Bob'", 
       (order, buyer, receiver) => 
       { 
        order.BuyerCustomer = buyer; 
        order.ReceiverCustomer = receiver; 
        return order; 
       }, splitOn: "CustomerId").First(); 

     Assert.That(result.BuyerCustomer.CustomerId == 2); 
     Assert.That(result.ReceiverCustomer.CustomerId == 3); 

     Assert.That(result.BuyerCustomer.CustomerName == "Jim"); 
     Assert.That(result.ReceiverCustomer.CustomerName == "Bob"); 
    } 
} 
+0

Oh, désolé pour la faute de frappe. Je l'ai corrigé. Laissez-moi essayer de faire un test. Merci. – Derstine

+0

Pourquoi dois-je supprimer Remove CustomerSecondId de Split? Honnêtement, je n'ai pas l'idée car j'en ai vraiment besoin pour les jointures. CustomerSecondId fait partie de la commande. – Derstine

+0

Lorsque vous regardez le résultat de la requête SQL, vous avez Order suivi par Customer, Customer, puis nous divisons simplement deux enregistrements client par CustomerId. Je vais éditer le dernier point. –