2012-02-28 8 views
60

मैं मान जैसे की "नाम" एक शब्दकोश है: "एलेक्स"कैसे एक साफ-सुथरी क्वेरी के लिए तर्क बनाने के लिए गतिशील रूप से

वहाँ एक प्रश्न के लिए तर्क के रूप में साफ-सुथरी को यह पारित करने के लिए कोई तरीका है?

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

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

उत्तर

99

हाँ:

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

फिर dbArgsargs के स्थान पर पारित:

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

वैकल्पिक रूप से, आप अपने खुद के वर्ग कि IDynamicParameters लागू करता है लिख सकते हैं।

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

var dbArgs = new DynamicParameters(templateObject); 
+12

ध्यान दें कि आप 'नया डायनामिक पैरामीटर (शब्दकोश)' कर सकते हैं और यह ठीक काम करेगा। – asgerhallas

+0

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

+7

नए डायनामिक पैरामीटर (शब्दकोश) को काम करने के लिए, शब्दकोश एक आईनेमरेबल > , उदाहरण के लिए शब्दकोश । शब्दकोश काम नहीं किया। –

3

मैं जानता हूँ कि यह एक पुराने सवाल यह है की तरह (, 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) 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^