Сопоставление нескольких свойств сложного типа с помощью Dapper - PullRequest
0 голосов
/ 30 января 2019

У меня есть следующий Dapper запрос:

var orderModels = db.Query<OrderModel>(@"
SELECT
    o.[Id],
    o.[CustomerId],

    o.[DeliveryAddress_FirstName],
    o.[DeliveryAddress_LastName],
    o.[DeliveryAddress_Line1],
    o.[DeliveryAddress_Line2],
    o.[DeliveryAddress_City],
    o.[DeliveryAddress_State],
    o.[DeliveryAddress_PostCode],
    o.[DeliveryAddress_Country],

    o.[BillingAddress_FirstName],
    o.[BillingAddress_LastName],
    o.[BillingAddress_Line1],
    o.[BillingAddress_Line2],
    o.[BillingAddress_City],
    o.[BillingAddress_State],
    o.[BillingAddress_PostCode],
    o.[BillingAddress_Country]
FROM
    [Order] o
");

И я хотел бы загрузить его в модель данных следующей структуры:

public class OrderModel
{
    public int Id { get; set; }
    public int CustomerId { get; set; }

    public AddressModel DeliveryAddress { get; set; }
    public AddressModel BillingAddress { get; set; }
}

public class AddressModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Line1 { get; set; }
    public string Line2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostCode { get; set; }
    public string Country { get; set; }
}

Я попытался посмотретьи в Dapper есть функция , называемая multi-mapping .Однако я не могу понять, как использовать его в моем сценарии использования, когда я не объединяю результаты из нескольких таблиц.

Это похоже на очень распространенный сценарий для ORM, такой как Dapper, поэтому яконечно, я просто упускаю что-то очевидное.Если вы более осведомлены о Dapper, пожалуйста, помогите.

Каков наилучший способ сделать это?

1 Ответ

0 голосов
/ 30 января 2019

Dapper не заботится о соединениях, вам просто нужно предоставить правильные поля для splitOn параметров, таких как:

    var orderModels = db.Query<OrderModel, AddressModel, AddressModel, OrderModel>(@"
    SELECT
        o.[Id],
        o.[CustomerId],

        o.[DeliveryAddress_FirstName] AS [FirstName], // Field names should match properties of your model
        o.[DeliveryAddress_LastName] AS [LastName],
        o.[DeliveryAddress_Line1] AS [Line1],
        o.[DeliveryAddress_Line2] AS [Line2],
        o.[DeliveryAddress_City] AS [City],
        o.[DeliveryAddress_State] AS [State],
        o.[DeliveryAddress_PostCode] AS [PostCode],
        o.[DeliveryAddress_Country] AS [Country],

        o.[BillingAddress_FirstName] AS [FirstName],
        o.[BillingAddress_LastName] AS [LastName],
        o.[BillingAddress_Line1] AS [Line1],
        o.[BillingAddress_Line2] AS [Line2],
        o.[BillingAddress_City] AS [City],
        o.[BillingAddress_State] AS [State],
        o.[BillingAddress_PostCode] AS [PostCode],
        o.[BillingAddress_Country] AS [Country]
    FROM
        [Order] o
    ", 
(order, deliveryAddress,  billingAddress) => {
   order.DeliveryAddress = deliveryAddress; 
   order.BillingAddress = billingAddress; 
   return order; 
},
splitOn: "FirstName,FirstName");

Это объяснено в этой статье .

Кроме того, имена полей выбора должны совпадать с именами свойств модели для Dapper, чтобы автоматически определить отображение.

...