如何为Dapper中的多映射支持命名列?
问题描述:
var sql = @"SELECT
a.id AS `Id`,
a.thing AS `Name`,
b.id AS `CategoryId`,
b.something AS `CategoryName`
FROM ..";
var products = connection.Query<Product, Category, Product>(sql,
(product, category) =>
{
product.Category = category;
return product;
},
splitOn: "CategoryId");
foreach(var p in products)
{
System.Diagnostics.Debug.WriteLine("{0} (#{1}) in {2} (#{3})", p.Name, p.Id, p.Category.Name, p.Category.Id);
}
'First (#1) in (#0)'
'Second (#2) in (#0)'
的CategoryId和类别名称具有值,因为下面的
var products = connection.Query(sql).Select<dynamic, Product>(x => new Product
{
Id = x.Id,
Name = x.Name,
Category = new Category { Id = x.CategoryId, Name = x.CategoryName }
});
结果:
'First (#1) in My Category (#10)'
'Second (#2) in My Category (#10)'
我连接到MySQL数据库如果与它有任何关系。
答
最简单的方法是将它们全部拨打Id
(不区分大小写,所以只需a.id
和b.id
都可以);那么你可以使用:
public void TestMultiMapWithSplit()
{
var sql = @"select 1 as Id, 'abc' as Name, 2 as Id, 'def' as Name";
var product = connection.Query<Product, Category, Product>(sql,
(prod, cat) =>
{
prod.Category = cat;
return prod;
}).First();
// assertions
product.Id.IsEqualTo(1);
product.Name.IsEqualTo("abc");
product.Category.Id.IsEqualTo(2);
product.Category.Name.IsEqualTo("def");
}
如果你不能做到这一点,有一个可选的splitOn
(string
)参数,需要一个逗号分隔的列清单在拆分处理。
+0
从来没有想过会这么容易!谢谢! – loraderon 2011-05-19 11:40:13
+0
@loraderon我们特别懒,我们写的东西很容易使用; p – 2011-05-19 12:09:05
您正在使用spliton,您是否介意在Google代码中向跟踪器提交破损的测试? – 2011-05-19 12:40:27
@Sam我猜如果我把''CategoryName''改成'Name''它应该可以工作吗?我的印象是,Dapper会使用一些automapper约定来映射''CategoryName''(也尝试过''Category.Name'')到'x.Category.Name' – loraderon 2011-05-19 13:07:49
是的,你是对的@loraderon,它不会追加分类到所有道具......实际上它更简单,只是为了处理结果集中的重复列名称。那么你可以做一些像'select * from posts p加入作者a on p.AuthorId = a.Id'这是很简洁的 – 2011-05-20 04:55:13