Dapper 多次映射到同一个表两次
如何在使用同一个表的两个字段上使用Dapper的多重映射功能?i、 e ClientInfo有两个地址对象 桌子 Relational—ClientInfo.PostalAddress/BillingAddress中使用的Address.IdDapper 多次映射到同一个表两次,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..
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不正确,您需要确保结果的顺序正确,以便正确拆分。对不起,我之前的回答中有错误。请参阅以上工作测试