在Dapper调用之后映射主/详细记录

时间:2017-10-05 22:57:40

标签: data-modeling dapper

在工作中,我们正在考虑使用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库?

1 个答案:

答案 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;
});