Dapperは、Massiveなどの番号付きパラメータを使用しますか?

dapper massive sql-server

質問

Dapperは名前付き(@a、@b、...)とは異なり、Massive(@ 0、@ 1、...)などの番号付きパラメータを使用しますか?

次のようにクエリを作成する必要があります。

//select @0 as val union select @1 union select @2 union select @3 union select @4 
//union select @5 union select @6 union select @7 union select @8 union select @9
var sb = new StringBuilder("select @0 as val");
for (int i = 1; i < 10; i++)
{
    sb.AppendFormat(" union select @{0}", i);
}
var query = sb.ToString();
//---Dapper = fail
var db = Connection;
var list = db.Query(query, param: new object[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 });
//---Massive = ok
var db2 = new Massive.DynamicModel(coins);
var list2 = db2.Query(query, args: new object[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 });

Dapperの問題に対する解決策は何ですか?

受け入れられた回答

Massiveはクエリで位置引数を使用しますが、Dapperは名前付きのものを使用します。だから大規模では、 new int[] {1,2,3}ようなパラメータ配列を渡すことができますが、dapperではnew { a = 1, b = 2 }ようnew { a = 1, b = 2 }パラメータオブジェクトを渡す必要があります。

dapperを使って同様のソリューションを実現するには、パラメータ辞書を渡すことができるDynamicParametersオブジェクトを作成します。ここで、キーはパラメータの名前で、valueはパラメータの値です。 {"0",0}, {"1", 1},など

LINQを使用して配列を簡単に辞書に変換できます。

var dictionary = new object[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    .Select((item, ind) => new {ind = ind.ToString(), item})
    .ToDictionary(item => item.ind, item => item.item);

DynamicParameters p = new DynamicParameters(dictionary);

var list = db.Query(query, param: p);


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