在工作中,我们正在考虑使用Dapper
。在现有代码库中,我们的主/明细对象是单独加载的。通常,这意味着对所有主记录执行了一个sql语句,并为每个详细记录执行了一个sql语句。
为了提高效果并简化过渡,我想使用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库?
答案 0 :(得分:0)
您可以尝试这样的事情:
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;
});