IEnumerable<T>के केवल आगे के कर्सर का प्रतिनिधित्व करता है T। .NET 3.5 विस्तार तरीकों कि शामिल जोड़ा LINQ standard query operatorsकी तरह Whereऔर First, किसी भी ऑपरेटरों कि विधेय या लेने अनाम प्रक्रियाएं की आवश्यकता के साथ Func<T>।
IQueryable<T>एक ही LINQ मानक क्वेरी ऑपरेटरों को लागू करता है, लेकिन Expression<Func<T>>विधेय और अनाम कार्यों के लिए स्वीकार करता है। Expression<T>एक संकलित अभिव्यक्ति ट्री है, विधि का टूटा हुआ संस्करण (यदि आप चाहें तो "आधा संकलित") जिसे क्वेरी करने वाले के प्रदाता द्वारा पार्स किया जा सकता है और तदनुसार उपयोग किया जा सकता है।
उदाहरण के लिए:
IEnumerable<Person> people = GetEnumerablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();
IQueryable<Person> people = GetQueryablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();
पहले ब्लॉक में, x => x.Age > 18एक अनाम विधि ( Func<Person, bool>) है, जिसे किसी अन्य विधि की तरह निष्पादित किया जा सकता है। Enumerable.Whereप्रत्येक व्यक्ति के लिए एक बार विधि निष्पादित करेगा, उन yieldमानों को सम्मिलित करेगा जिनके लिए विधि वापस लौटी true।
दूसरे ब्लॉक में, x => x.Age > 18एक एक्सप्रेशन ट्री ( Expression<Func<Person, bool>>) है, जिसे "एज 'प्रॉपर्टी> 18" माना जा सकता है।
यह LINQ-to-SQL जैसी चीजों को मौजूद करने की अनुमति देता है क्योंकि वे अभिव्यक्ति ट्री को पार्स कर सकते हैं और इसे समकक्ष SQL में बदल सकते हैं। और क्योंकि प्रदाता जब तक निष्पादित करने के लिए की जरूरत नहीं है IQueryable(यह औजार प्रगणित है IEnumerable<T>, सब के बाद), यह कई क्वेरी ऑपरेटरों (ऊपर के उदाहरण में गठजोड़ कर सकते हैं Whereऔर FirstOrDefault) कैसे अंतर्निहित डेटा के खिलाफ संपूर्ण क्वेरी को निष्पादित करने पर बेहतर विकल्प चुनने के लिए source (जैसे SELECT TOP 1SQL में उपयोग करना )।
देख: