値の辞書があります。例:「名前」:「アレックス」
これをクエリの引数としてDapperに渡す方法はありますか?
ここに私がしたいことを示す例があります。
IDictionary<string, string> args = GetArgsFromSomewhere();
string query = "select * from people where Name = @Name";
var stuff = connection.Query<ExtractionRecord>(query, args);
はい:
var dbArgs = new DynamicParameters();
foreach(var pair in args) dbArgs.Add(pair.Key, pair.Value);
次に、dbArgs
の代わりにargs
を渡します。
var stuff = connection.Query<ExtractionRecord>(query, dbArgs);
または、IDynamicParameters
を実装する独自のクラスを作成できます。
オブジェクトから開始する場合(dapperを使用した通常のアプローチ)、DynamicParameters
を開始点としてこのテンプレートを使用することもできます。
var dbArgs = new DynamicParameters(templateObject);
これは古い質問(5歳など)であることは知っていますが、同じことに苦労していました。完全な答えは、他の答えに対するコメントにありますが、ここで完全な例を提供すると思いました。
string query = "SELECT * FROM MyTableName WHERE Foo = @Foo AND Bar = @Bar";
Dictionary<string, object> dictionary = new Dictionary<string, object>();
dictionary.Add("@Foo", "foo");
dictionary.Add("@Bar", "bar");
var results = connection.Query<MyTableName>(query, new DynamicParameters(dictionary));
または、完全に動的にするために、次のようなメソッドを作成できます。このメソッドは、モデル、クエリ、およびクエリパラメータのセットを受け取ります。
public static IEnumerable<T> Get<T>(string query, Dictionary<string, object> dictionary)
{
IEnumerable<T> entities = connection.Query<T>(query, new DynamicParameters(dictionary));
return entities;
}
そして、このメソッドを呼び出すには:
var results = Get<MyTable>(query, dictionary)
Dapper固有のクラスExpandoObject
の代わりに、DynamicParameters
をクエリのパラメーターとして使用することもできます。
ExpandoObject param = new ExpandoObject();
IDictionary<string, object> paramAsDict = param as IDictionary<string, object>;
paramAsDict.Add("foo", 42);
paramAsDict.Add("bar", "test");
MyRecord stuff = connection.Query<MyRecord>(query, param);