Dapperを使用して5種類以上をマッピングする

c# dapper sql

質問

私は現在、12のテーブルを結合するSELECTクエリを構築しています。私はDapperを他のすべてのクエリに使用していて、うまくいきます。問題は、ジェネリックメソッドは5つのジェネリックパラメータしか持たないことです。

以前は別のクエリで6までサポートするようにコードを変更しましたが、今では6つのレベルのジェネリックをハッキングする必要があるとは思っていません。

それは、型の配列をdapperに渡す方法はありますか?それはオブジェクトの配列として結果を返します。私は手動でキャストできますか?

私はまた、間違った方法で問題に近づいているかもしれません!どんな助けもありがとう!

受け入れられた回答

私が取り組んだプロジェクトでは、7種類以上のマップを取得するために、このようなものを見ました。私たちはDapper 1.38を使用しました:

connection.Query<TypeOfYourResult>
(
   queryString,
   new[]
   {
      typeof(TypeOfArgument1),
      typeof(TypeOfArgument2),
      ...,
      typeof(TypeOfArgumentN)
   },
   objects =>
   {
      TypeOfArgument1 arg1 = objects[0] as TypeOfArgument1;
      TypeOfArgument2 arg2 = objects[1] as TypeOfArgument2;
      ...
      TypeOfArgumentN argN = objects[N] as TypeOfArgumentN;

     // do your processing here, e.g. arg1.SomeField = arg2, etc.
     // also initialize your result

     var result = new TypeOfYourResult(...)

     return result;
   },
   parameters,
   splitOn: "arg1_ID,arg2_ID, ... ,argN_ID"
);

queryStringは自明です。 splitOnパラメータは、すべてのオブジェクトをオブジェクトに適切にマップできるように、Dapperが列をSELECT文から分割する方法を示しますここでそのことを読むことができます


人気のある回答

動的クエリを使用して後でマップすることができます。このようなもの

var result = conn.Query<dynamic>(query).Select(x => new Tuple<Type1, Type2, Type3, Type4, Type5>( 
// type initialization here 
    new Type1(x.Property1,x.Property2),
    new Type2(x.Property3,x.Property4),
    new Type3(x.Property5,x.Property6) etc....));

編集:かなり大きな結果セットを使用すると、別のオプションが複数のクエリーを使用して、グリッドリーダーを使用することがあります。それはあなたのために働くかもしれません。

大胆な時代から取られた例があります:

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
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow