IQueryable सर्वर पर मूल्यांकन करने के बिना एक अभिव्यक्ति पेड़ के रूप में क्वेरी का प्रतिनिधित्व करता है:
यहाँ मेरी कोड है। यह वास्तव में SQL उत्पन्न करने से पहले आगे प्रसंस्करण निर्दिष्ट करने देता है।
ऊपर मामले में, यह मतलब है कि आप GetItems() कॉल के परिणाम के साथ सामान कर सकते हैं, और मूल क्वेरी और किसी एक क्वेरी के रूप में भेजा अतिरिक्त सामान है:
var recentItems = from item in GetItems()
where item.Timestamp > somedate
select item;
foreach (var item in recentItems)
{
// Do something with an active recent item.
}
कुछ भी नहीं भेज दिया जाता है सर्वर तक जब तक हम फ़ोरैच लूप में परिणाम का उपभोग करने का प्रयास नहीं करते हैं। उस बिंदु पर, LINQ-to-SQL प्रदाता संपूर्ण अभिव्यक्ति का आकलन करता है, जिसमें GetItems()
के अंदर उत्पन्न बिट्स और बाद में निर्दिष्ट बिट्स शामिल हैं, और एक एकल SQL कथन उत्सर्जित करता है जो सक्रिय और हालिया दोनों आइटमों का चयन करता है।
तकनीकीता को स्पष्ट करने के लिए, IQueryable<T>
एक IEnumerable<T>
है, और जब आप GetEnumerator()
विधि को आमंत्रित करने का प्रयास करते हैं तो इसका प्रदाता अंतिम SQL की गणना करता है। आप या तो इसे कॉल करके स्पष्ट रूप से कर सकते हैं, या foreach
कथन में इसका उपयोग करके स्पष्ट रूप से ऐसा कर सकते हैं। साथ ही, ToArray()
जैसे विस्तार विधियां आंतरिक रूप से इनमें से एक कार्य करेंगी, इस प्रकार एक ही प्रभाव उत्पन्न करेंगी।
स्रोत
2010-07-18 11:25:27
महान प्रश्न में मदद करता है। आपने मुझे शोध के घंटे बचाए। – KyleM