値の配列が与えられたら、これらの値に基づいてプロパティを持つ匿名オブジェクトを作成したいと思います。プロパティ名は、単に"pN"
となります。ここで、N
は配列内の値のインデックスです。プロパティ名が動的に決定された匿名オブジェクトを作成する方法は?
例えば、
object[] values = { 123, "foo" };
与えられた私はこれを行うには、私は考えることができる唯一の方法は、使用することであろう匿名オブジェクト
new { p0 = 123, p1 = "foo" };
を作成したいですswitch
またはif
をサポートするには、合理的な数のパラメータまで連鎖しますが、これを行うためのよりエレガントな方法があるかどうか疑問に思っていました。
object[] parameterValues = new object[] { 123, "foo" };
dynamic values = null;
switch (parameterValues.Length)
{
case 1:
values = new { p0 = parameterValues[0] };
break;
case 2:
values = new { p0 = parameterValues[0], p1 = parameterValues[1] };
break;
// etc. up to a reasonable # of parameters
}
背景
私は、データベースに対してSQL文を実行する方法の既存のセットを持っています。これらのメソッドは、通常、SQL文の場合はstring
、パラメータがある場合はparams object[]
となります。クエリがパラメータを使用する場合、その名前は@p0, @p1, @p2, etc.
となります。
例:
このように呼ばれることになるpublic int ExecuteNonQuery(string commandText, CommandType commandType, params object[] parameterValues) { .... }
:
db.ExecuteNonQuery("insert into MyTable(Col1, Col2) values (@p0, @p1)", CommandType.Text, 123, "foo");
今、私はDapperののQuery<T>
メソッドをラップし、公開するために、このクラス内Dapperを使用したい、としてそう既存の方法、例えば
public IEnumerable<T> ExecuteQuery<T>(string commandText, CommandType commandType, params object[] parameterValues) { .... }
が、DapperののQuery<T>
方法は匿名オブジェクトのパラメータ値を取ります:何かのように
var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });
Dapperのにパラメータを渡すために匿名のオブジェクトを作成する方法について、私の質問につながります。
@Paolo Tedescoの要求に従ってDynamicParameter
クラスを使用してコードを追加します。
string sql = "select * from Account where Id = @p0 and username = @p1";
dynamic values = new DynamicParameter(123, "test");
var accounts = SqlMapper.Query<Account>(connection, sql, values);
はDapperののSqlMapper.csファイルの行581で例外がスローされます:
using (var reader = cmd.ExecuteReader())
と例外がSqlException
次のとおりです。
はスカラー変数 "@ P0" を宣言する必要があります。
をチェックし、cmd.Parameters
プロパティをチェックすると、コマンドに設定されたパラメータが表示されません。
はい、DynamicParameterを誤って使用しています(243行目を参照)。http://code.google.com/p/dapper-dot-net/source/browse/Tests/Tests.cs –
また、IDynamicParamtersは絶対柔軟性。ダッパの利益のために、あなたは一種の学習体験として、無名のタイプを焼く必要はありませんが、努力する価値はありません。特に、あなたが本当にemitを使いたければ、ICollectionから強力な型を作ることができます。 –