我正在为当前查询使用多个映射,现在我需要在初始查询上映射另一个对象.
例如:
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; }
}
Run Code Online (Sandbox Code Playgroud)
小巧精致的:
connection.Query<Part, Address, Part>(sql, (part, address) => {
part.Address = address;
});
Run Code Online (Sandbox Code Playgroud)
如何获取Address类以获取SiteOu信息?
这个例子不是我实际做的,因为我实际上已经得到了
Query<T1,T2,T3,T4,T5,TResult>();
Run Code Online (Sandbox Code Playgroud)
我在查询中做了1个select和5个连接.所以希望我不需要更多的Query重载.
Voi*_*Ray 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);
}
Run Code Online (Sandbox Code Playgroud)
重要说明: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();
...
}
Run Code Online (Sandbox Code Playgroud)
另请查看此主题.