Dapper Multi-map下一级

时间:2013-06-11 14:36:08

标签: dapper

我正在为当前查询使用多个映射,现在我需要在初始查询上映射另一个对象。

例如:

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; }
}

Dapper:

 connection.Query<Part, Address, Part>(sql, (part, address) => {
    part.Address = address;
  });

如何获取Address类以获取SiteOu信息?

这个例子不是我实际做的,因为我实际上已经

Query<T1,T2,T3,T4,T5,TResult>();  

我正在查询中进行1次选择和5次连接。所以希望我不需要更多的Query重载。

1 个答案:

答案 0 :(得分: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);
}

重要提示: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();
   ...
} 

另请查看此thread