डायपर क्वेरी के लिए गतिशील रूप से तर्क कैसे बनाएं


86

मेरे पास मूल्यों का एक शब्दकोश है "नाम": "एलेक्स"

क्या डापर को एक प्रश्न के तर्क के रूप में पारित करने का कोई तरीका है?

यहां एक उदाहरण दिखाया गया है कि मैं क्या करना चाहता हूं।

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

जवाबों:


140

हाँ:

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

ध्यान दें कि यदि आप किसी ऑब्जेक्ट (डैपर के साथ सामान्य दृष्टिकोण) से शुरू कर रहे हैं, तो आप इस टेम्पलेट का उपयोग DynamicParametersशुरुआती बिंदु के रूप में भी कर सकते हैं :

var dbArgs = new DynamicParameters(templateObject);

25
ध्यान दें कि आप कर सकते हैं new DynamicParameters(dictionary)और यह ठीक काम करेगा।
asgerhallas

1
@asgerhallas कि फरवरी में सच नहीं हो सकता है, लेकिन हाँ: क्या आप रहे हों तो सही - निश्चित रूप से सच है कि अब
मार्क Gravell

10
नए डायनेमिकपैरेटर्स (डिक्शनरी) को काम करने के लिए, शब्दकोश में IEnumerable <KeyValuePair <string, object >> होना चाहिए, उदाहरण के लिए शब्दकोश <string, object>। शब्दकोश <स्ट्रिंग, स्ट्रिंग> काम नहीं किया।
ज़ार शारदान

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)

संपादित करें लंबी अवधि के बाद

यह उत्तर आगे बढ़ता रहता है, इसलिए यह स्पष्ट रूप से अभी भी एक आवश्यकता है। मैंने इस समाधान को लिया और डैपर के शीर्ष पर निर्मित एक संपूर्ण डेटा एक्सेस नुगेट पैकेज बनाया। यह आपके CRUD और क्वेरी ऑपरेशंस को कोड की एक सिंगल लाइन तक कम करता है।

यहाँ NuGet पैकेज है


0

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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.