2012-12-28 23 views
5

पर वापसी डेटाटाइप मेरे पास एक ऐसा फ़ंक्शन है जो एक ऑब्जेक्ट देता है जो मेरे डेटाबेस और अतिरिक्त कॉलम में रिकॉर्ड का प्रतिनिधित्व करता है। इसके बजाय इस वस्तु के लिए एक अलग वर्ग बनाने की मैं अगर वहाँ एक और तरीका है सोच रहा था, उदाहरण के लिए:एक linq क्वेरी

public object GetRecord(string key) 
{ 
    var item = select new {column1, column2}; 

    return item; 
} 

public void main() 
{ 
    var item = GetRecord(1); 

    // I want to be able to reference column1 on item. 
    var x = item.column1; 
} 

उत्तर

8

हां, अन्य तरीके हैं (वास्तव में कुछ वास्तव में), लेकिन मैं दृढ़ता से सुझाव देता हूं कि आप उनमें से किसी का भी उपयोग न करें। इस मामले को संभालने का सबसे अच्छा विकल्प एक नया कस्टम प्रकार बनाना है जो आपके पास मौजूद डेटा पर है। यह अब तक का सबसे रखरखाव विकल्प होगा।

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

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

आप समय और प्रयास यह इन कस्टम प्रकार बनाने के लिए ले जाएगा के बारे में चिंतित हैं, वहाँ स्वचालित उपकरणों डेटाबेस तालिकाओं या अन्य स्रोतों के आधार पर इस तरह के वर्गों पैदा करने के लिए डिज़ाइन की गई हैं कर रहे हैं।

+1

+1, मुझे कस्टम प्रकार बनाने के लिए _not_ बनाने का कोई कारण नहीं दिखता है। –

6

यदि यह .net है 4.0 उपयोग dynamic कीवर्ड।

public dynamic GetRecord(string key) 
{ 
    var item = select new {column1, column2}; 

    return item; 
} 
+0

मैं गतिशील उपयोग कर रहा हूं, लेकिन मुझे कॉलम नाम वाई लगता है इंटेलिजेंस में दिखाई नहीं देगा। लेकिन रनटाइम पर काम करेगा। – Arcadian

+0

यदि आप अन्य दायरे पर हैं कि आपने अपना गतिशील प्रकार बनाया है, तो इंटेलिजेंस काम नहीं करेगा। –

+0

इंटेलिजेंस के लिए आपको ठोस प्रकार का उपयोग करने की आवश्यकता है (जिसे चुनिंदा खंड में बदला नहीं जा सकता है)। इसके लिए फ़ेलिप द्वारा उत्तर देने का संदर्भ लें। – Tilak

2

केवल अन्य उत्तरों का पूरक है, आप यह भी करने के लिए जेनेरिक का उपयोग कर सकते हैं। कुछ इस तरह:

public T GetRecord<T>(string key) 
    where T : IAnyInterfaceWithProperties, new 
{ 
    var item = select new T { PropertyOfInterface = value, Property2 = value2 }; 

    return item; 
} 
+1

यह वाक्यविन्यास त्रुटियों से भरा है। इंटरफ़ेस बाधा के बाद 'नई' बाधा डालें, कास्ट को 'टी' और' select' पर हटा दें। – Adam

+0

@codesparkle युक्तियों के लिए धन्यवाद। मैं इस मामले में सोच रहा था, हमें वास्तव में 'चयन' कीवर्ड की आवश्यकता है? –

3

इसके अलावा अगर यह 4.0 शुद्ध है आप उपयोग कर सकते हैं एक Tuple<object,object> तो item.Item1 द्वारा इसे संदर्भ। आप बस object की बजाय ऑब्जेक्ट्स टाइपिंग का उपयोग कर सकते हैं।

public Tuple<Column1Type,Column2Type> GetRecord(string key) 
{ 
    var item = select new Tuple<Column1Type,Column2Type>(column1, column2); 

    return item; 
} 
1

आप इसके लिए एक पीओसीओ लाइब्रेरी का उपयोग करने पर विचार कर सकते हैं - वही करेंगे जो आप चाहते हैं।

आप अपनी खुद की रोल या एक का उपयोग कर सकते हैं जो पहले से ही उपलब्ध है:

http://code.google.com/p/dapper-dot-net/

आपका कोड तो कुछ इस तरह दिखेगा:

var result = connection.Query("select col1, col2 from table1"); 

var x = result[0].col1; 

Drapper भी मदद से आप एक मजबूत प्रकार है उदाहरण:

var result = connection.Query<myType>("select col1, col2 from table1"); 

' Now result is a list of myType