2010-11-26 12 views
5

मैं एक विस्तार विधि है जो एक व्यक्ति वास्तव में मुझे देने के लिए मददगार था है ... यह IQueryable पर एक orderby है ... लेकिन मैं एक सामान्य IQueryable (गैर सामान्य)IQueryable (गैर सामान्य): गुम गणना और छोड़ें? यह IQueryable के साथ काम करता <T>

करने के लिए एक चाहते थे यहां कोड है, गिनती और छोड़ें और मुझे लगता है कि टेक गायब हैं।

public static IQueryable GetPage(this IQueryable query, 
     int page, int pageSize, out int count) 
    { 
     int skip = (int)((page - 1) * pageSize); 

     count = query.Count(); //COUNT DOESN'T EXIST 
     return query.Skip(skip).Take((int)pageSize); // NEITHER SKIP 
    } 

यहां है और यह पूरी तरह से कोई त्रुटि नहीं करता है।

public static IQueryable<T> GetPage<T>(this IQueryable<T> query, 
     int page, int pageSize, out int count) 
    { 
     int skip = (int)((page - 1) * pageSize); 

     count = query.Count(); 
     return query.Skip(skip).Take((int)pageSize); 
    } 

कोई विचार मैं इसके आसपास कैसे हो सकता हूं? मैं अपने रिटर्न प्रकारों को पूरी तरह से काम नहीं करना चाहता क्योंकि यह पूरी तरह से काम करता है और मेरे पास ToDataTable नामक एक और एक्सटेंशन विधि है और यह गैर जेनेरिक IQueryable पर भी काम करता है ..

क्या कोई काम है?

अग्रिम धन्यवाद

संपादित

मैं एक मौजूदा IQueryable

IQueryable<Client> gen = null; 
IQueryable nongen = null; 

var test = gen.GetPage(); //COMPILES! 

var test 1 = non.GetPage(); // Doesn't compile because GETPAGE 
          // for non generic is broken as it has 
          // invalid methods like COUNT and SKIP etc. 

मैं GetPage गैर जेनेरिक वर्जन को दूर करने की कोशिश की लेकिन उसके बाद मेरी गैर जेनेरिक Iqueryable नहीं करता है 'पर इतना है कि यह फोन इस तथ्य के कारण एक्सटेंशन को पिकअप नहीं करें, लेकिन यह केवल एक IQueryable

उत्तर

11

हम ll, काफी आसानी से वे विधियां IQueryable के लिए उपलब्ध नहीं हैं। यदि आप Queryable methods देखते हैं तो आप देखेंगे कि वे लगभग IQueryable<T> पर आधारित हैं।

तो आपके डेटा स्रोत वास्तव में निष्पादन समय में एक IQueryable<T> हो जाएगा, और तुम सिर्फ नहीं पता है कि T है, तो आप पता लगा कि प्रतिबिंब के साथ ... या सी # 4 में, बस का उपयोग गतिशील टाइपिंग:

public static IQueryable GetPage(this IQueryable query, 
    int page, int pageSize, out int count) 
{ 
    int skip = (int)((page - 1) * pageSize); 
    dynamic dynamicQuery = query; 
    count = Queryable.Count(dynamicQuery); 
    return Queryable.Take(Queryable.Skip(dynamicQuery, skip), pageSize); 
} 

सी # संकलक के गतिशील बिट निष्पादन समय पर आप के लिए T काम का ख्याल रखना होगा।

सामान्य रूप से, मैं आपको हर जगह जेनेरिक रूप का उपयोग करने की कोशिश करने के लिए प्रोत्साहित करता हूं - यह काफी सरल होने की संभावना है।

+0

धन्यवाद जॉइन! आप सी # 4.0 बताते हैं - मैं 3.5 का उपयोग कर रहा हूं .. तो मैं 3.5 में मानक प्रतिबिंब का उपयोग कर सकता हूं ?? मैं आशा करता हूँ? – Martin

+1

@ मार्टिन: हाँ। आपको कंक्रीट प्रकार का 'क्वेरी' प्राप्त करना होगा और यह पता लगाना होगा कि यह कौन सा इंटरफेस लागू करता है ... उस के माध्यम से' टी 'ढूंढें, फिर' Queryable.Count' 'कॉल करने के लिए 'MethodInfo.MakeGenericMethod' का उपयोग करें। इसकी संभावना है बहुत जल्दी गन्दा हो जाओ। –

+0

हां !! ओह अच्छी तरह से सोचने वाला होगा ... :-) पुष्टि के लिए धन्यवाद। – Martin

0

प्रश्न पुराना है, लेकिन जब किसी को IQueryable एक्सटेंशन विधियों की आवश्यकता होती है तो वापसी का नाम अज्ञात होने पर उसे IQueriable वापस करना चाहिए।

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