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


88

値の辞書があります。例: "Name": "Alex"

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

これが私がやりたいことを示す例です。

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

回答:


144

はい:

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);

25
あなたがすることができてnew DynamicParameters(dictionary)、それがうまくいくことに注意してください。
asgerhallas 2012

1
2月には真されていない可能性があります@asgerhallas、しかし、はい:あなたしている右-今確かに真実である
マルクGravell

11
新しいDynamicParameters(dictionary)が機能するためには、辞書はIEnumerable <KeyValuePair <string、object >>である必要があります(例:Dictionary <string、object>)。Dictionary <string、string>が機能しませんでした。
Zar Shardan 2014年

17

これは古い質問(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上に構築されたデータアクセスNuGetパッケージ全体を作成しました。CRUDとクエリの操作を1行のコードに減らします。

これがNuGetパッケージです。


1

ExpandoObjectDapper固有のクラスの代わりに、クエリのパラメータとしてを使用することもできます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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.