2008-09-10 11 views
12

मेरे पास एक लिंक क्वेरी है जिसे मैं एकाधिक स्थानों से कॉल करना चाहता हूं:मैं एक विधि से एक अनाम प्रकार कैसे वापस कर सकता हूं?

var myData = from a in db.MyTable 
      where a.MyValue == "A" 
      select new { 
          a.Key, 
          a.MyValue 
          }; 

मैं एक विधि कैसे बना सकता हूं, इस कोड को इसमें डाल सकता हूं, और फिर इसे कॉल कर सकता हूं?

public ??? GetSomeData() 
{ 
    // my Linq query 
} 
+0

आप ढ़ंग क्यों वापस नहीं करते हैं? –

+1

यह सिर्फ एक साधारण उदाहरण था। मेरे पास बहुत अधिक मूल्य हैं जो मैं वास्तव में चुन रहा हूं कि – ScottG

+0

में संभवतः डुप्लिकेट [रिटर्न अज्ञात प्रकार?] (Http://stackoverflow.com/questions/534690/return-anonymous-type) – nawfal

उत्तर

9

IQueryable और IEnumerable दोनों काम। लेकिन आप एक प्रकार के विशिष्ट संस्करण का उपयोग करना चाहते हैं, IQueryable < टी > या आईनेमेरेबल < टी >

तो आप डेटा रखने के लिए एक प्रकार बनाना चाहते हैं।

var myData = from a in db.MyTable 
      where a.MyValue == "A" 
      select new MyType 
      { 
       Key = a.Key, 
       Value = a.MyValue 
      }; 
+0

इस समाधान पर विस्तार के लिए आपको बहुत धन्यवाद। कुंजी एक विशिष्ट प्रकार का उपयोग कर रहा था। यह बहुत अच्छा काम करता है – ScottG

+0

अरे मैंने जवाब दिया 1 घंटा डैरेन डैरेन। नमूना देने के लिए मुझे सही काम करता है :) –

+0

स्पष्ट होने के लिए, क्या हो रहा है यह है कि नया {...} एक अनाम प्रकार बनाता है (var कीवर्ड के उपयोग की आवश्यकता है)। इस प्रकार का कोई नाम नहीं है और केवल उस विधि में स्थानीय रूप से उपयोग किया जा सकता है जिसने इसे बनाया है (जब तक कि आप प्रतिबिंब का उपयोग न करें)। इसे बाहर उपयोग करने के लिए, आपको एक नामित प्रकार बनाना होगा। – Lucas

7

IQueryable

तो अपने विधि घोषणा देखो की तरह

public IQueryable GetSomeData() 
+0

धन्यवाद! इससे काफी मदद मिलती है/ – ScottG

+2

ऐसा करके आप इंटेलिजेंस नहीं करेंगे और केवल प्रतिबिंब के माध्यम से वस्तुओं के गुणों तक पहुंच सकते हैं। –

+1

ध्यान रखें कि क्वेरी अभी तक नहीं चल रही है। –

2

वापस करना चाहते हैं, तो आप एक प्रकार की आवश्यकता होगी।

var के बजाय, IEnumerable<> का उपयोग करके घोषित करें और उस चर को वापस करें। इसके माध्यम से छेड़छाड़ वास्तव में क्वेरी निष्पादित करता है।

3

एक सामान्य विधि आप IntelliSense देना चाहिए:

public class MyType {Key{get;set;} Value{get;set}} 

public IQueryable<T> GetSomeData<T>() where T : MyType, new() 
{ return from a in db.MyTable 
      where a.MyValue == "A" 
      select new T {Key=a.Key,Value=a.MyValue}; 
}