2014-10-30 11 views
17

मैं अब के लिए dapper.net का उपयोग कर रहा हूं और यह एक बहुत अच्छा ओआरएम मैपर है जो नेट गतिशील प्रकारों के साथ बहुत अच्छा काम करता है लेकिन मैंने देखा कि जब डैपर डेटाबेस से डेटा पुनर्प्राप्त करता है तो यह डैपर पंक्ति प्रकार के रूप में आता है किसी भी तरह से मैं इसे सिस्टम की तरह किसी अन्य प्रकार में वापस कर सकता हूं। गतिशील। एक्सपेन्डो ऑब्जेक्ट?डैपर गतिशील रिटर्न प्रकार

उत्तर

15

DapperRow ऑब्जेक्ट पंक्तियों के बीच बहुत सारे राज्य साझा करने के लिए डिज़ाइन किया गया है। उदाहरण के लिए, यदि आप 40 पंक्तियां प्राप्त करते हैं, तो कॉलम नाम इत्यादि केवल को पर संग्रहीत किया जाता है। अगर हमने ExpandoObject का उपयोग किया है, तो इसे प्रति पंक्ति कॉन्फ़िगर करने की आवश्यकता होगी। इसलिए, पीछे के दृश्यों के रूप में DapperRow का उपयोग एक जानबूझकर दक्षता की बात है।

ध्यान दें कि dynamic एपीआई से लौटाई गई वस्तु को IDictionary<string,object> के रूप में भी डाला जा सकता है।

हालांकि, मैं अन्य प्रकारों का समर्थन करने के लिए खुला हूं, जो इस शब्दकोश उपयोग का समर्थन करते हैं - जिनमें से ExpandoObject एक है।

var rows = conn.Query<ExpandoObject>(...); 

काम करता है: तो हाँ, यह ऐसी है कि बदला जा सकता है। इसे बस पर का समर्थन करने की आवश्यकता है, और यह कोड वर्तमान में मौजूद नहीं है। तो "नहीं, लेकिन शायद भविष्य में निर्माण में"।

भी ध्यान रखें कि आप बिल्कुल DapperRow उपयोग करने के लिए की जरूरत नहीं है ... और उम्मीद परिदृश्य अपने स्वयं के प्रकार के अमल में लाना करने के लिए सामान्य एपीआई का उपयोग करने के लिए है।

25

ज़रूर!

व्यवसायिक प्रलेखन के अनुसार क्वेरी विधि का उपयोग करें और अपने dymanics मिलती है:

dynamic account = conn.Query<dynamic>(@" 
        SELECT Name, Address, Country 
        FROM Account 
      WHERE Id = @Id", new { Id = Id }).FirstOrDefault(); 
Console.WriteLine(account.Name); 
Console.WriteLine(account.Address); 
Console.WriteLine(account.Country); 

आप देख सकते हैं आप एक गतिशील वस्तु मिलता है और आप के रूप में वे अच्छी तरह से क्वेरी बयान में परिभाषित कर रहे हैं जब तक उसके गुण का उपयोग कर सकते हैं ।

यदि आप .FirstOrDefault() छोड़ देते हैं तो आपको IEnumerable<dynamic> मिलता है जो आप जो भी चाहते हैं उसे कर सकते हैं।

8

मुझे यह समस्या है और मैंने इस तरह से हल किया है!

Query() फ़ंक्शन गतिशीलता का संग्रह देता है जो वास्तव में नीचे Dapper.SqlMapper.DapperRow ऑब्जेक्ट प्रकार हैं। Dapper.SqlMapper.DapperRow निजी है। मुझे गतिशील रूप से Dapper.SqlMapper.DapperRow ऑब्जेक्ट्स में गुण जोड़ने की आवश्यकता है लेकिन यह काम नहीं करता है। नतीजतन मैं Dapper.SqlMapper.DapperRow को ExpandoObject में परिवर्तित करना चाहता था।

मैं इस सामान्य सहायक विधि को नीचे की तरह बनाने में सक्षम था।

public class DapperHelpers 
{ 
    public static dynamic ToExpandoObject(object value) 
    { 
     IDictionary<string, object> dapperRowProperties = value as IDictionary<string, object>; 

     IDictionary<string, object> expando = new ExpandoObject(); 

     foreach (KeyValuePair<string, object> property in dapperRowProperties) 
      expando.Add(property.Key, property.Value); 

     return expando as ExpandoObject; 
    } 
} 

तो फिर तुम है कि इस तरह का उपयोग कर सकते हैं:

IEnumerable<ExpandoObject> result = 
      db.SqlConn.Query(sqlScript) 
       .Select(x=> (ExpandoObject)ToExpandoObject(x)); 

संदर्भ: dapper-dot-net issues 166

+1

कारण है कि हम वस्तु को स्पष्ट रूप से expando को व्यवसायिक पंक्ति कन्वर्ट करने के लिए है, यह दृष्टिकोण सही निम्नलिखित के माध्यम से convertable है? var पंक्तियां = conn.Query (...); –

+1

शायद डैपर के अगले संस्करण में जो सही काम करता है लेकिन संस्करण 1.4 में जो मैंने उपयोग किया था, उस परिवर्तित वस्तु में कोई संपत्ति नहीं है। मुझे इस समाधान को डैपर मुद्दों से मिला। – Behzad

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