9

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

例如:

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

小巧玲珑:

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

如何让 Address 类拥有 SiteOu 信息?

这个例子不是我实际在做的,因为我实际上有

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

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

4

1 回答 1

12

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();
   ...
} 

另请查看此线程

于 2013-06-11T17:43:29.533 回答