18

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

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

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

私も間違った方法で問題に取り組んでいる可能性があります!どんな助けでもありがたいです!

4

3 に答える 3

30

私が取り組んだプロジェクトでは、7つ以上のタイプをマッピングするためにこのようなものを見ました。Dapper1.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ステートメントから列を分割して、すべてをオブジェクトに適切にマップできるようにする方法を示します 。これについては、ここで読むことができます

于 2015-06-25T10:18:35.060 に答える
4

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

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();
   ...
} 
于 2012-04-18T05:29:08.080 に答える
2

これはずっと前に答え​​られました、しかし私はここに私の2セントを加えたいと思います。Dapperのソースコードを手動で変更する代わりに、これらのフィールドを使用してpocoクラスを作成し、クエリをテーブルのように使用してみませんか?

マッピングは問題なく機能します。そのクラス定義を行うのも面倒ですが、後のDapperの更新を処理するよりも簡単なようです。

于 2013-06-10T17:58:01.687 に答える