2015-12-23 21 views
2

我有2個班,訂單和地址如下:小巧玲瓏的地圖中列名的前綴

public class Order 
{ 
    public string OrderId { get; set; } 
    public Address ShippingAddress { get; set; } 
    public Address BillingAddress { get; set; } 
} 

public class Address 
{ 
    public string Street { get; set; } 
    public string Town { get; set; } 
    public string Zip { get; set; } 
} 

數據庫存儲命令和地址,在一個單一的表如下:

CREATE TABLE Orders 
    (
     OrderId NVARCHAR(56) PRIMARY KEY, 
     BillingStreet NVARCHAR(256), 
     BillingTown NVARCHAR(256), 
     BillingZip NVARCHAR(256), 
     ShippingStreet NVARCHAR(256), 
     ShippingTown NVARCHAR(256), 
     ShippingZip NVARCHAR(256) 
    ) 

enter image description here

我該如何將精靈映射到Order類?

回答

2

通過查詢概括帳單和發貨列,並使用Query多種類型的版本,並在看到名爲「地址」的列時告訴它進行拆分,您可以這樣做。然後,您只需將Address對象分配給Order對象上的相應屬性。

connection.Query<Order, Address, Address, Order>(
    @"SELECT OrderId, 
      BillingAddress As Address, 
      BillingTown As Town, 
      BillingZip As Zip, 
      ShippingAddress As Address, 
      ShippingTown As Town, 
      ShippingZip As Zip, 
     FROM Orders", 
    (o, ba, sa) => 
    { 
     o.BillingAddress = ba; 
     o.ShippingAddress = sa; 
     return o; 
    }, 
    splitOn: "Address"); 
+0

謝謝你,會試試這個 –

+0

我的數據庫引擎要求所有別名都是唯一的。 Dapper是否有辦法根據列前綴將Billing *和Shipping *映射到它們各自的對象? – Bart

+0

@Bart你可以在你的查詢中處理,比如'Select BillingId As Id,BillingName As Name,ShippingId As Id,ShippingName As Name ....'不過我相信Dapper確實有更復雜的映射功能,但我從來沒有親自使用它們。您可能想爲此編寫自己的問題。 – juharr

0

我不認爲它可能與Dapper,因爲它將行視爲單個對象。這將是可能的,如果你會改變你的表結構:

CREATE TABLE Orders 
(
    OrderId NVARCHAR(56) PRIMARY KEY, 
    BillingAddressId INT 
    ShippingAddressId INT 
) 

然後,你將不得不類更改爲:

public class Order 
{ 
    public string OrderId { get; set; } 
    public int ShippingAddressId {get; set;} 
    public virtual Address ShippingAddress { get; set; } 
    public int BillingAddressId {get; set;} 
    public virtual Address BillingAddress { get; set; } 
} 

,只是使用多映射。

另一種選擇是使用Dapper擴展名,如Dapper-FluentMapDapper Extensions這將幫助您將列映射到類。