Dapper Multi-map下一级

Kyl*_*ers 9 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; }
}
Run Code Online (Sandbox Code Playgroud)

小巧精致的:

 connection.Query<Part, Address, Part>(sql, (part, address) => {
    part.Address = address;
  });
Run Code Online (Sandbox Code Playgroud)

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

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

Query<T1,T2,T3,T4,T5,TResult>();  
Run Code Online (Sandbox Code Playgroud)

我在查询中做了1个select和5个连接.所以希望我不需要更多的Query重载.

Voi*_*Ray 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);
}
Run Code Online (Sandbox Code Playgroud)

重要说明: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();
   ...
} 
Run Code Online (Sandbox Code Playgroud)

另请查看此主题.

  • @KyleRogers你有没有将dapper更新到当前版本?我看到`查询<TFirst,TSecond,TThird,TFourth,TFifth,TSixth,TSeventh,TReturn>`? (3认同)
  • 如何处理地址中有两个SiteOu属性的情况? (2认同)