我正在为当前查询使用多个映射,现在我需要在初始查询上映射另一个对象。
例如:
public class Part {
public int Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
public class Address {
public int Id { get; set; }
public string Street { get; set; }
public SiteOu Ou { get; set; }
}
public class SiteOu
public int Id { get; set; }
public string Name { get; set; }
}
Dapper:
connection.Query<Part, Address, Part>(sql, (part, address) => {
part.Address = address;
});
如何获取Address类以获取SiteOu信息?
这个例子不是我实际做的,因为我实际上已经
了Query<T1,T2,T3,T4,T5,TResult>();
我正在查询中进行1次选择和5次连接。所以希望我不需要更多的Query重载。
答案 0 :(得分:13)
Dapper允许您将单个行映射到多个对象,因此您只需将SiteOu映射为同一查询的一部分。
[Test]
public void TestSplitOn()
{
var conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Integrated Security=true;Initial Catalog=db");
conn.Open();
const string sql = "select Id = 1, Name = 'My Part', " +
"Id = 2, Street = 'My Street', " +
"Id = 3, Name = 'My Site'";
var result = conn.Query<Part, Address, SiteOu, Part>(sql, (part, address, siteOu) =>
{
part.Address = address;
address.Ou = siteOu;
return part;
},
commandType: CommandType.Text
).FirstOrDefault();
Assert.That(result, Is.Not.Null);
Assert.That(result.Address, Is.Not.Null);
Assert.That(result.Address.Ou, Is.Not.Null);
}
重要提示:Dapper假设您的Id列被命名为“Id”或“id”,如果您的主键不同或者您希望在“Id”以外的位置拆分宽行,请使用可选的'splitOn'参数。
如果要映射的类型超过5种,则另一种开箱即用的选项是使用QueryMultiple扩展。以下是Dapper文档中的一个示例。
var sql =
@"
select * from Customers where CustomerId = @id
select * from Orders where CustomerId = @id
select * from Returns where CustomerId = @id";
using (var multi = connection.QueryMultiple(sql, new {id=selectedId}))
{
var customer = multi.Read<Customer>().Single();
var orders = multi.Read<Order>().ToList();
var returns = multi.Read<Return>().ToList();
...
}
另请查看此thread。