Dinamik olarak bir Dapper sorgusu için bağımsız değişkenler oluşturma


88

Değerler sözlüğüm var. Ör. "Ad": "Alex"

Bunu bir sorgu için bağımsız değişken olarak Dapper'a iletmenin bir yolu var mı?

İşte yapmak istediğim şeyi gösteren bir örnek.

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

Yanıtlar:


144

Evet:

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

Daha sonra şunların dbArgsyerine geçin args:

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

Alternatif olarak, uygulayan kendi sınıfınızı yazabilirsiniz. IDynamicParameters .

Bir nesneden başlıyorsanız (zarif ile olağan yaklaşım), bu şablonu DynamicParametersbir başlangıç ​​noktası olarak da kullanabileceğinizi unutmayın :

var dbArgs = new DynamicParameters(templateObject);

25
Yapabileceğinizi new DynamicParameters(dictionary)ve iyi çalışacağını unutmayın.
asgerhallas

1
@asgerhallas bu Şubat ayında doğru olmayabilir, ama evet: haklısın - bu şimdi kesinlikle doğru
Marc Gravell

11
Yeni DynamicParameters'ın (sözlük) çalışması için, sözlüğün IEnumerable <KeyValuePair <string, nesne >>, örneğin Dictionary <string, object> olması gerekir. Sözlük <dize, dize> çalışmadı.
Zar Shardan

17

Bunun eski bir soru olduğunu biliyorum (5 yaşında gibi) ama aynı şeyle uğraşıyordum. Tam cevap, diğer cevaba yapılan yorumlarda, ancak burada tam bir örnek sunacağımı düşündüm.

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

Veya tamamen dinamik olmak için, herhangi bir modeli, herhangi bir sorguyu ve herhangi bir sorgu parametresi kümesini alacak olan bunun gibi bir yöntem oluşturabilirsiniz:

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

Ve sonra bu yöntemi çağırmak için:

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

SONRA UZUN DÜZENLE

Bu cevap olumlu oylar almaya devam ediyor, bu yüzden görünüşe göre bu hala bir ihtiyaç. Bu çözümü aldım ve Dapper üzerine inşa edilmiş tam bir veri erişimi NuGet paketi oluşturdum. CRUD ve sorgu işlemlerinizi tek bir kod satırına indirger.

İşte Nuget paketi .


1

ExpandoObjectDapper'a özgü sınıf yerine bir sorgunun parametreleri olarak bir de kullanılabilir 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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.