web-dev-qa-db-ja.com

Dapperクエリの引数を動的に作成する方法

値の辞書があります。例:「名前」:「アレックス」

これをクエリの引数としてDapperに渡す方法はありますか?

ここに私がしたいことを示す例があります。

IDictionary<string, string> args = GetArgsFromSomewhere();
string query = "select * from people where Name = @Name";
var stuff = connection.Query<ExtractionRecord>(query, args);
74
Cogslave

はい:

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);
121
Marc Gravell

これは古い質問(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)
9
Casey Crookston

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);
0
turdus-merula