Cara membuat argumen untuk kueri Dapper secara dinamis

88

Saya memiliki kamus nilai Misalnya "Nama": "Alex"

Adakah cara untuk meneruskan ini ke Dapper sebagai argumen untuk kueri?

Berikut adalah contoh yang menunjukkan apa yang ingin saya lakukan.

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

Jawaban:

144

Iya:

var dbArgs = new DynamicParameters();
foreach(var pair in args) dbArgs.Add(pair.Key, pair.Value);

Kemudian berikan dbArgsdi tempat args:

var stuff = connection.Query<ExtractionRecord>(query, dbArgs);

Atau, Anda dapat menulis kelas Anda sendiri yang mengimplementasikan IDynamicParameters.

Perhatikan bahwa jika Anda memulai dari sebuah objek (pendekatan biasa dengan necis), Anda juga dapat menggunakan template ini DynamicParameterssebagai titik awal:

var dbArgs = new DynamicParameters(templateObject);
Marc Gravell
sumber
25
Perhatikan bahwa Anda dapat melakukannya new DynamicParameters(dictionary)dan itu akan bekerja dengan baik.
asgerhallas
1
@asgerhallas yang mungkin tidak benar di bulan Februari, tapi ya: Anda benar - itu pasti benar sekarang
Marc Gravell
11
agar DynamicParameters (kamus) baru berfungsi, kamus harus berupa <KeyValuePair <string, objek >> IEnumerable, misalnya Dictionary <string, object>. Kamus <string, string> tidak berfungsi.
Zar Shardan
17

Saya tahu ini adalah pertanyaan lama (seperti, 5 tahun) tetapi saya berjuang dengan hal yang sama. Jawaban lengkapnya ada di komentar di jawaban lain, tapi saya pikir saya akan menawarkan contoh lengkapnya di sini.

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

Atau, agar sepenuhnya dinamis, Anda dapat membuat metode seperti ini, yang akan menggunakan model apa pun, kueri apa pun, dan kumpulan parameter kueri apa pun:

    public static IEnumerable<T> Get<T>(string query, Dictionary<string, object> dictionary)
    {
        IEnumerable<T> entities = connection.Query<T>(query, new DynamicParameters(dictionary));
        return entities;
    }

Dan kemudian memanggil metode ini:

var results = Get<MyTable>(query, dictionary)

EDIT PANJANG SETELAH

Jawaban ini terus mendapatkan upvote, jadi ini sepertinya masih perlu. Saya mengambil solusi ini dan membuat paket NuGet akses data keseluruhan yang dibangun di atas Dapper. Ini mengurangi operasi CRUD dan kueri Anda menjadi satu baris kode.

Berikut paket NuGet .

Casey Crookston
sumber
1

Seseorang juga dapat menggunakan an ExpandoObjectsebagai parameter kueri, sebagai ganti kelas khusus Dapper 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);
turdus-merula
sumber