2011-10-11 10 views
5

पर गिनती है मैं रॉब कॉनरी के विशाल ओआरएम का उपयोग कर रहा हूं।एक आईनेमेरेबल <dynamic>

क्या रिकॉर्ड सेट पर गिनती करने का कोई शानदार तरीका है?

dynamic viewModelExpando = result.ViewData.Model; 
var queryFromMassiveDynamic = viewModelExpando.TenTricksNewestFirst; 

//fails as have actually got TryInvokeMember on it 
var z = queryFromMassiveDynamic.Count(); 

//works 
int i = 0; 
foreach (var item in queryFromMassiveDynamic) { 
    i++; 
} 

उत्तर

13

विस्तार विधि सदस्य वाक्यविन्यास का उपयोग करके इसे कॉल करने के बजाय, स्थिर विधि को सीधे कॉल करने का प्रयास करें।

int count = Enumerable.Count(queryFromMassiveDynamic); 
+0

पाठ्यक्रम का +1 ... विस्तार विधि नहीं मिलेगी। मैं गतिशील के रनटाइम ओवरलोड रिज़ॉल्यूशन जादू से चिंतित हूं। मुझे हमेशा इसके बारे में भूलना प्रतीत होता है। – sehe

4

प्रश्न थोड़ा सा है। आप वास्तव में IEnumerable<dynamic> की गिनती नहीं कर रहे हैं। आप dynamic पर एक गिनती (0 उम्मीद है कि IEnumerable) पर एक गिनती है।

यह करने के लिए सरल तरीके से एक डाली का उपयोग करना है:

var z = (queryFromMassiveDynamic as IEnumerable<dynamic>).Count(); 
4

आप sehe का जवाब, परिणाम कास्ट करने के लिए है जो ले जा सकते हैं।

var z = (queryFromMassiveDynamic as IEnumerable<dynamic>).Count(); 

इसके बजाय, यह समझें कि आप क्वेरी सदस्य फ़ंक्शन से क्या प्राप्त कर रहे हैं। आप वास्तव में गतिशील प्रकार के एक IENumerable प्राप्त कर रहे हैं और var उन लोगों के साथ परेशानी है।

बदलें इस लाइन

var queryFromMassiveDynamic = viewModelExpando.TenTricksNewestFirst; 

करने के लिए इस

IEnumerable<dynamic> queryFromMassiveDynamic = viewModelExpando.TenTricksNewestFirst; 

गणना किसी भी कास्टिंग करने के लिए बिना दिखाई देगा।

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