Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Dapper映射多个复杂类型属性_C#_.net_Orm_Dapper - Fatal编程技术网

C# 使用Dapper映射多个复杂类型属性

C# 使用Dapper映射多个复杂类型属性,c#,.net,orm,dapper,C#,.net,Orm,Dapper,我有以下简洁的问题: var orderModels = db.Query<OrderModel>(@" SELECT o.[Id], o.[CustomerId], o.[DeliveryAddress_FirstName], o.[DeliveryAddress_LastName], o.[DeliveryAddress_Line1], o.[DeliveryAddress_Line2], o.[DeliveryAddre

我有以下简洁的问题:

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
");
我已经试着查过了,有一个问题。然而,当我不连接来自多个表的结果时,我不知道如何在我的用例中使用它

对于像Dapper这样的ORM来说,这是一个非常常见的场景,所以我确信我只是错过了一些明显的东西。如果你对整洁更了解,请帮忙


实现这一点的最佳方法是什么?

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");
var orderModels=db.Query(@)
挑选
o、 [Id],
o、 [客户ID],
o、 [DeliveryAddress_FirstName]为[FirstName],//字段名应与模型的属性匹配
o、 [DeliveryAddress\u LastName]作为[LastName],
o、 [DeliveryAddress_Line1]作为[Line1],
o、 [DeliveryAddress_Line2]作为[Line2],
o、 [DeliveryAddress_City]作为[City],
o、 [DeliveryAddress_State]作为[State],
o、 [送货地址\邮政编码]为[邮政编码],
o、 [DeliveryAddress_Country]作为[Country],
o、 [BillingAddress_FirstName]作为[FirstName],
o、 [BillingAddress\u LastName]作为[LastName],
o、 [BillingAddress_Line1]作为[Line1],
o、 [BillingAddress_Line2]作为[Line2],
o、 [BillingAddress_City]作为[City],
o、 [BillingAddress_State]作为[State],
o、 [BillingAddress_PostCode]作为[PostCode],
o、 [BillingAddress_Country]作为[Country]
从…起
[命令]o
", 
(订单、发货地址、账单地址)=>{
order.DeliveryAddress=交货地址;
order.BillingAddress=BillingAddress;
退货单;
},
斯普利顿:“名字,名字”);
这一点在本文中进行了解释


此外,select的字段名必须与模型属性名匹配,以便Dapper自动计算映射。

感谢您的帮助。我认为您的类型参数有误,它可能应该是
。但即使我这样做了,账单地址和送货地址的所有属性仍然为空。是的,修复了参数order。。。我想问题可能是这些列的前缀仍然是
DeliveryAddress.
。。。我尝试为列添加别名以删除前缀,结果成功了。但是我不得不说,重命名所有这些列(并且有多个同名列)感觉有点奇怪。我真的不喜欢为了整洁而做特殊的投影。如果可以配置Dapper,那就更好了,因为映射结果是Dapper的职责,而且不会让我更改查询。如果这些结果是在存储过程中生成的呢?你可以看看,但我自己还没有尝试过。谢谢,我不认为自定义映射在这种情况下会有所帮助,但值得一试。无论如何,使用列别名的解决方案是有效的,即使它并不完美。
    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");