在Dapper调用后映射主/明细记录
问题描述:
在工作中,我们正在考虑使用Dapper
。在现有的代码库中,我们的主/明细对象是分开加载的。通常,这意味着有一个sql语句针对所有主记录执行,一个sql语句针对每个详细记录执行。在Dapper调用后映射主/明细记录
为了提高性能和易用性的过渡,我想提出使用Dapper
2调用和结果缝合在一起:
public class Zoo
{
Guid Id { get; set; }
string Name { get; set;}
IList<Monkey> Monkeys { get; set; }
}
public class Monkey
{
Guid Id { get; set; }
Guid ZooId { get; set; }
string Name { get; set; }
bool DeservesBanana { get; set; }
}
var sqlZoos = "SELECT * FROM Zoos"
var Zoos = connection.Query(sqlZoos)
var sqlMonkeys = "SELECT * FROM Monkeys"
var Zoos = connection.Query(sqlZoos)
foreach(var zoo in Zoos)
{
zoo.Monkeys = Monkeys.Where(x => x.ZooId = zoo.Id).ToList();
}
是否有Dapper
一个辅助方法或东西,我可以用它来代替foreach
。我应该使用类似AutoMapper
的东西吗?或者有更好的方法来实现这个(比foreach
循环)使用.NET库?
答
你可以尝试这样的事:
var zoos = new Dictionary<string, Zoo>();
var query = "SELECT * FROM Zoos LEFT OUTER JOIN Monkeys ON Monkeys.ZooId = Zoos.Id";
_connection.Query<Zoo, Monkey, Zoo>(query, (z, m) =>
{
if (!zoos.TryGetValue(z.Id, out Zoo zoo))
zoos.Add(z.Id, zoo = z);
zoo.Monkeys.Add(m);
return zoo;
});
感谢。最终,我想重写我们的代码来执行单个SELECT语句。但是,需要重新编写一个代码_lot_。设计最简单的方法在多个查询后将数据拼接在一起将允许我们引入具有最小摩擦的“Dapper” – Mitkins