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 を使用すると、1 つの行を複数のオブジェクトにマップできるため、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 つを超える場合、すぐに使用できるもう 1 つのオプションは、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 に答える