Dapper 多次映射到同一个表两次

Dapper 多次映射到同一个表两次,dapper,Dapper,如何在使用同一个表的两个字段上使用Dapper的多重映射功能?i、 e ClientInfo有两个地址对象 桌子 Relational—ClientInfo.PostalAddress/BillingAddress中使用的Address.Id tbl.Address |Id|FirstLine|SecondLine|Town|PostCode tbl.ClientInfo |Id|FirstName|LastName|PostalAddress|BillingAddress|etc..

如何在使用同一个表的两个字段上使用Dapper的多重映射功能?i、 e ClientInfo有两个地址对象

桌子 Relational—ClientInfo.PostalAddress/BillingAddress中使用的Address.Id

tbl.Address
|Id|FirstLine|SecondLine|Town|PostCode    

tbl.ClientInfo
|Id|FirstName|LastName|PostalAddress|BillingAddress|etc..
当前实施 结果仅在正在映射的除PostalAddress之外的所有中

var sql = @"select * from ClientInfo c left join Address as a on a.Id = c.PostalAddress left join Address as ad on ad.Id = c.BillingAddress";

var clients = connection.Query<ClientInfo, Address, Address, ClientInfo>(
                    sql,
                    (client, postal, billing) =>
                    {
                        client.PostalAddress = postal;
                        client.BillingAddress = billing;
                        return client;
                    },
                    splitOn: "PostalAddress,BillingAddress")
                .Distinct()
                .ToList();

return clients;

当然,您不必在select语句中提供GUI,这只是为了让测试正常工作

[Test]
public void TestAbcd()
{
    using (var dbConnection = new SqlConnection(_connectionString))
    {
        const string sql = @"WITH ClientInfo AS (

                                 SELECT * FROM (
                                     VALUES (@ci1, @adr1, @adr2), (@ci1, @adr3, @adr4)
                                     ) AS a (Id, PostalAddress, BillingAddress)
                             ),

                             Address AS (

                                 SELECT * FROM (
                                     VALUES
                                         (@adr1), (@adr2), (@adr3), (@adr4)
                                     ) AS a (Id)

                             )

                             select * from ClientInfo c left join Address as a on a.Id = c.PostalAddress left join Address as ad on ad.Id = c.BillingAddress";

        dbConnection.Open();

        var clients = dbConnection.Query<ClientInfo, Address, Address, ClientInfo>(
                sql,
                (client, postal, billing) =>
                {
                    client.PostalAddress = postal;
                    client.BillingAddress = billing;
                    return client;
                },
                splitOn: "PostalAddress,BillingAddress",  param: new {
                    ci1 = Guid.NewGuid(),
                    ci2 = Guid.NewGuid(),
                    adr1 = Guid.NewGuid(), 
                    adr2 = Guid.NewGuid(),
                    adr3 = Guid.NewGuid(),
                    adr4 = Guid.NewGuid()
                })
            .Distinct()
            .ToList();

    }
}
splitOn参数告诉Dapper何时/何地开始映射下一个对象,因此需要确保SQL查询以正确的顺序返回信息。现在,返回2个用于PostalAddress和BillingAddress的GUID。Dapper不知道如何将两者都映射到地图上

从…中选择*。。。参加将导致在ClientInfo.PostalAddress和ClientInfo.BillingAddress列之后排序的地址数据

尝试:从ClientInfo中选择c.Id、c.FirstName、c.LastName、c.ContactNumber、a.*和ad.*作为a上的左侧加入地址。Id=c.PostalAddress作为a上的广告加入地址。Id=c.BillingAddress

tbl.Address
|Id|FirstLine|SecondLine|Town|PostCode    

tbl.ClientInfo
|Id|FirstName|LastName|PostalAddress|BillingAddress|etc..

如您所见,删除*有效地将PostLaddress和BillingAddress Guid从结果中排除,我们现在可以拆分为:Id,Id。

谢谢,删除或更改拆分结果都会导致:“无法将类型为”System.Guid“的对象强制转换为类型为”WorkAssignTest.Address“。SQL不正确,您需要确保结果的顺序正确,以便正确拆分。对不起,我之前的回答中有错误。请参阅以上工作测试