Dapperマルチマップ次のレベル

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

ダッパ:

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

AddressクラスでSiteOu情報を取得するにはどうすればよいですか?

この例は私が実際にやっていることではありません。

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

私は私のクエリで1つの選択と5つの結合をしています。だからうまくいけば、私はより多くのクエリのオーバーロードを必要としません。

受け入れられた回答

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

また、このスレッドをチェックアウトします



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ