繁体   English   中英

列名中带有前缀的 Dapper 映射

[英]Dapper map with prefix in column name

我有 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)
    )

在此处输入图片说明

我怎样才能让 dapper 将它映射到 Order 类?

您可以通过以下方式实现这一点:使查询概括计费和运输列,并使用具有多种类型的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");

我认为 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 -FluentMapDapper ExtensionsDapper 扩展,这将帮助您将列映射到类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM