2017-07-26 118 views
0

我有兩個類小巧玲瓏多映射結果

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

這裏是我的查詢將看起來像

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 

小巧玲瓏實現..

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

我得到的結果是不完整,只有RecevierCustomer被填充,而BuyerCustomer根本不包含任何值。

由於我在查詢中使用了兩次CustomerId,所以它看起來像dapper一樣困惑。 有沒有任何解決方法,而不必改變我的客戶類?

回答

0

您的課堂設計和Dapper查詢幾乎沒有問題。

  • Customer.CustomerName應該是字符串
  • 我會從已刪除客戶ID和CustomerSecondId。它們是多餘的。您在客戶中都有Id。
  • 從Split拆除CustomerSecondId。

下面是一個工作測試:

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

哦,遺憾的錯字。我修好了它。讓我試着做一些測試。謝謝。 – Derstine

+0

爲什麼我需要從Split中刪除CustomerSecondId?我真的不明白,因爲我真的需要它的加入。 – Derstine

+0

CustomerSecondId是訂單的一部分。當您查看SQL查詢結果時,您有Order和Customer,Customer,那麼我們只需按CustomerId劃分兩個客戶記錄。我將編輯最後一點。 –