2009-07-01 10 views
44

संभव डुप्लिकेट:
LINQ to SQL: Return anonymous type?कैसे SQL करने के लिए LINQ का उपयोग करता है ग # विधि से अनाम प्रकार वापस जाने के लिए

मैं (SQL क्वेरी, जो एक गुमनाम प्रकार के रूप में डेटा देता है के लिए एक मानक LINQ है जिसमें विभिन्न डेटाटाइप के डेटा के लगभग 6 कॉलम होते हैं)।

मैं इस लौटा ऑब्जेक्ट को प्रोग्राम के अन्य हिस्सों में उपलब्ध करना चाहता हूं, या तो इसे विधि-कॉलर पर लौटकर या विधि वाले ऑब्जेक्ट की संपत्ति को सौंपकर।

मैं यह कैसे कर सकता हूं कि यह एक अनाम प्रकार ("var") है?

using (ormDataContext context = new ormDataContext(connStr)) 
    { 
     var electionInfo = from t1 in context.elections 
        join t2 in context.election_status 
        on t1.statusID equals t2.statusID 
        select new { t1, t2 }; 
    } 
+0

टी 1, टी 2 फ़ील्ड क्या हैं? –

+0

इसे अब के लिए मूल प्रश्न पर एक ब्रेडक्रंब निशान के रूप में छोड़ना। अगर आपको लगता है कि दो प्रश्न विलय किए जाने चाहिए तो एक टिप्पणी छोड़ दो, और मैं बाद में जांच करूंगा। –

+0

बस एक स्पष्टीकरण बनाने के लिए, 'var' एक अनाम प्रकार नहीं है। 'var' एक शॉर्टेंड कीवर्ड है जिसे आप कंपाइलर प्रदान करने का उपयोग कर सकते हैं प्रकार का अनुमान लगा सकते हैं। इस मामले में, 'electionInfo' अनाम प्रकार है। –

उत्तर

65

किसी कक्षा के गुमनाम प्रकार करें ...

public class Person 
{ 
    public Person() { 
    } 

    public String Name { get; set; } 
    public DateTime DOB { get; set; } 
} 


Person p = 
    from person in db.People 
    where person.Id = 1 
    select new Person { 
     Name = person.Name, 
     DOB = person.DateOfBirth 
    } 
+0

+1 मैंने अभी इस तरह एक उत्तर पोस्ट किया है, मुझे इसे हराया। :) –

+0

ऐसा होने पर नफरत है! :) –

+3

ठीक है, तो आप मूल रूप से अज्ञात वर्ग का उपयोग न करने के लिए कह रहे हैं ... मैं मानता हूं कि यह बहुत स्पष्ट लगता है। मुझे लगता है कि मैं सोच रहा हूं कि अधिकांश LINQ नमूने var का उपयोग क्यों करते हैं यदि उन्हें काम करना मुश्किल हो ... – alchemical

19

आप सी # में किसी भी विधि टाइप नहीं कर सकते हैं एक गुमनाम से स्पष्ट प्रकार होने के लिए: -

संपादित करें यहाँ कोड है प्रकार के। उन्हें बोलने के लिए "नामित" नहीं किया जा सकता है और इसलिए मेटाडेटा हस्ताक्षर में दिखाई नहीं दे सकता है।

तुम सच में एक मूल्य है जो एक गुमनाम प्रकार है वापस जाने के लिए चाहते हैं वहाँ 2 विकल्प

  1. विधि की वापसी प्रकार System.Object हो गए हैं। फिर आप किसी अन्य विधि में टाइप किए गए मान प्राप्त करने के लिए बुराई कास्टिंग हैक कर सकते हैं। यह बहुत नाजुक है और मैं इसकी अनुशंसा नहीं करता हूं।
  2. रिटर्न प्रकार सही करने के लिए एक सामान्य विधि और एक प्रकार अनुमान अनुमान का उपयोग करें। इसके लिए आपके दृष्टिकोण के लिए एक बहुत ही रोचक हस्ताक्षर परिभाषा की आवश्यकता होगी।

बेनामी प्रकार वास्तव में इस फैशन में पारित होने के लिए नहीं थे। इस बिंदु पर आपको उन्हें अपने कार्यों के बीच इस तरह से पारित करने की आवश्यकता है, आप एक प्रकार को स्पष्ट रूप से परिभाषित करने से बेहतर हैं।

+1

डायनामिक डेटा-टाइप –

+0

का उपयोग करें, इस बिंदु पर आपको उन्हें अपने तरीके से अपने कार्यों के बीच पारित करने की आवश्यकता है, आप स्पष्ट रूप से एक प्रकार को परिभाषित करने से बेहतर हैं [ जाहिर है आप एक (जावास्क्रिप्ट) गोल्फर नहीं हैं] (https://s-media-cache-ak0.pinimg.com/736x/76/a3/9c/76a39cea29fe872eab52a6b4680f5c66.jpg)। ; ^) – ruffin

5

जॉन स्कीट ने यह कैसे किया है इस पर एक ब्लॉग लिखा है, जो Horribly Grotty Hack का सही मायने में सही है। जैसा कि शीर्षक बताता है, आपको वास्तव में अनाम प्रकार को वापस करने के तरीकों की तलाश नहीं करनी चाहिए। इसके बजाए, आपको एक ऐसा प्रकार बनाना चाहिए जिसे वापस किया जा सके क्योंकि यह इस सुविधा को लागू करने का सही तरीका है।

इसलिए, मैं अनुशंसा करता हूं कि आप लौटने के प्रकार की ठोस परिभाषा बनाएं और उसके बाद इसे वापस करने के लिए अपनी क्वेरी में पॉप्युलेट करें।

+0

... क्लासिक एएसपी से रिकॉर्डसेट ऑब्जेक्ट को याद रखना ... ऐसा लगता है कि यह कोड-जटिलता और प्रदर्शन के बीच एक व्यापार-बंद है ...एक छोटे से कार्यक्रम के लिए कोई बड़ा सौदा नहीं है, लेकिन सैकड़ों डीबी कॉल के साथ एक बड़ी परियोजना पर, प्रत्येक डेटा-सेट के लिए एक कस्टम ऑब्जेक्ट बनाना, और डीबी में परिवर्तन होने पर उन्हें बदलने के लिए, दर्द की तरह लगता है और कोड जटिलता में वृद्धि .. – alchemical

+0

और यह तब है कि आपको यह विचार करना चाहिए कि आप जो काम कर रहे हैं उसके लिए सही तकनीक का उपयोग कर रहे हैं या नहीं। जब आपको चाहिए तो एक हथौड़ा का उपयोग न करें। –

+0

तो, मेरे पास अभी "रिकॉर्डसेट" प्रकार ऑब्जेक्ट कैसे हो सकता है, यानी सभी लौटाए गए प्रकारों को एक मानक में लिपटे ऑब्जेक्ट्स के रूप में स्टोर करता है। नेट ऑब्जेक्ट जिसे मैं आसानी से घूम सकता हूं? – alchemical

6

var का उपयोग करके यह एक अनाम प्रकार नहीं बनाता है। Var का उपयोग करने का मतलब है कि इस चर को असाइनमेंट के दाईं ओर उपलब्ध प्रकार के प्रकार का होना चाहिए। यह सिर्फ छोटा हाथ है। यदि दाएं हाथ की बात एक असली कक्षा है, तो चर उस प्रकार का होगा।

उदाहरण के लिए:

var person = new Person { Name = "bob" }; 

व्यक्ति वैरिएबल प्रकार व्यक्ति का है, भले ही यह वर कीवर्ड का इस्तेमाल किया।

बेनामी प्रकार नए {नाम = ...} का उपयोग करके बनाए जाते हैं। इस मामले में यह एक नई, अज्ञात वर्ग है।एकमात्र चीज जिसे आप इसे असाइन कर सकते हैं वह var (या ऑब्जेक्ट) का उपयोग करके परिभाषित एक चर है क्योंकि उपयोग करने के लिए कोई मौजूदा नाम नहीं है।

उदाहरण के लिए:

var person = new { Name = "bob" }; 

इस मामले में, व्यक्ति एक गुमनाम प्रकार रन टाइम पर परिभाषित किया गया है।

आम तौर पर, जैसा कि @ चाल्की कहते हैं, यदि आप परिणाम को किसी अन्य विधि में पास करना चाहते हैं, तो नामित प्रकार का उपयोग करें, अज्ञात नहीं।

यदि आपको किसी अज्ञात प्रकार का उपयोग करने के लिए मजबूर किया जाता है, तो आपको इसे Object के प्रकार के रूप में वापस पास करना होगा, फिर इसके गुणों को प्राप्त करने के लिए प्रतिबिंब का उपयोग करें।

+0

मैंने अपने कोड के साथ यह कोशिश की, लेकिन नए नामित चर (आपके उदाहरण में "व्यक्ति"), विधि के लिए उपयोग करने योग्य वापसी प्रकार के रूप में इंटेलिजेंस में सुनिश्चित नहीं है ... – alchemical

+0

आपको अपने लिए कोड पोस्ट करना होगा आपको और सलाह देने के लिए मेरे लिए विधि। – tvanfosson

+0

Thx, मैंने अभी प्रश्न में कोड जोड़ा है। – alchemical

0

यदि आपको एक बड़े ऐप में परिणाम पास करना है तो आप शब्दकोश का उपयोग कर सकते हैं। हां, जब आप कास्टिंग करते हैं तो आपके ऊपर कुछ ओवरहेड होता है लेकिन कम से कम आप वस्तुओं को फेंकने से कम कर रहे हैं।

2

यह इस बात पर निर्भर करता है कि कॉलिंग कोड डेटा का उपयोग कैसे करेगा।

यदि आप सरल डेटा बाध्यकारी कर रहे हैं, तो वास्तव में इस प्रकार की परवाह नहीं है (यानी आपको अपने सी # कोड में स्पष्ट रूप से गुणों का उपयोग करने की आवश्यकता नहीं है), आप परिणामों को वापस आईनंबरबल के रूप में पास कर सकते हैं।

अधिकांश डेटाबेस मामलों में आप नाम से संपत्तियों को कॉल कर रहे हैं, जादू तारों के माध्यम से, वैसे भी, सटीक प्रकार वैसे भी कोई फर्क नहीं पड़ता।

अन्यथा, आपको अनाम प्रकार को किसी नामित प्रकार में परिवर्तित करने की आवश्यकता है।

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