2012-04-04 7 views
6

मेरे पास डेटा एक्सेस क्लास है जिसने मुझे काम करने के लिए कुछ समय लगाया। मेरे ऐप के लिए, मुझे विभिन्न प्रकार के एसक्यूएल सर्वर टेबल प्राप्त करने होंगे, जहां WHERE क्लॉज केवल कॉलम नाम से अलग है: कुछ कॉलम read_time हैं, अन्य रीडटाइम हैं, और अन्य LastModifiedTime हैं। तो मैंने सोचा कि मैं WHERE खंड में कब गुजरता हूं इसलिए मुझे 50 अलग-अलग तालिकाओं के लिए एक नई विधि बनाने की आवश्यकता नहीं थी। यह आसान लग रहा है, और यह काम करता है, लेकिन मुझे कुछ समझ में नहीं आता है।Func <> और अभिव्यक्ति <Func<>> परिवर्तनीय क्यों हैं? मेरे मामले में कोई काम क्यों करता है?

अभिव्यक्ति <> पैरामीटर के रूप में के साथ इस विधि, काम करता है:

internal List<T> GetObjectsGreaterThanReadTime<T>(Expression<Func<T, bool>> whereClause) where T : class 
{ 
    Table<T> table = this.Database.GetTable<T>(); 
    IEnumerable<T> objects = table.Where(whereClause); 

    return objects.ToList(); 
} 

अब, मैं इसे इस तरह (नीचे) थोड़ी देर के लिए कोशिश कर रहा था, और यह सिर्फ अंतिम पंक्ति पर लटका दिया (ToList())। सबसे पहले, यह संकलन क्यों करेगा? मेरा मतलब है, क्यों अभिव्यक्ति और Func एक पैरामीटर के रूप में एक दूसरे के रूप में इस्तेमाल किया जा सकता है? फिर, अभिव्यक्ति क्यों काम करती है, और Func संस्करण बस लटकता है?

नोट: उपरोक्त विधि के बीच एकमात्र अंतर और यह एक विधि पैरामीटर (अभिव्यक्ति बनाम Func) है।

internal List<T> GetObjectsGreaterThanReadTime<T>(Func<T, bool> whereClause) where T : class 
{ 
    Table<T> table = this.Database.GetTable<T>(); 
    IEnumerable<T> objects = table.Where(whereClause); 

    return objects.ToList(); 
} 
+3

यह, उत्तर के साथ संयोजन में "अभिव्यक्ति वृक्ष का बिंदु क्या है" के लिए एक बहुत अच्छी प्रतिक्रिया है प्रश्नों की शैली। +1 क्यू एंड ए –

उत्तर

12

अभिव्यक्ति संस्करण Queryable.Where जो एक अभिव्यक्ति पेड़ है, जो (जब ToList द्वारा प्रगणित) एसक्यूएल करने के लिए अनुवाद किया है और डेटाबेस सर्वर पर निष्पादित किया जाता है उत्पन्न करता है कहता है। संभवतया, संपूर्ण तालिका पढ़ने से बचने के लिए डेटाबेस सर्वर फिल्टर मानदंडों के आधार पर एक सूचकांक का लाभ उठाएगा।

समारोह संस्करण Enumerable.Where जो (जब ToList द्वारा प्रगणित) पूरे तालिका (क्या आप एक हैंग रूप में क्या अनुभव) को लोड करता है कहता है और उसके बाद में स्मृति वस्तुओं के खिलाफ फ़िल्टर मापदंड चलाता है।

+0

अह्ह्ह्ह्ह्ह्ह्ह्ह्ह्ह्ह्ह्ह्ह्ह ... एनआईसीई। कुल समझ में आता है। धन्यवाद! –

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

  • कोई संबंधित समस्या नहीं^_^