मैंने बहुत शोध करने की कोशिश की, लेकिन मैं एक db आदमी से अधिक हूं - इसलिए MSDN में स्पष्टीकरण भी मेरे लिए कोई मतलब नहीं है। क्या कोई कृपया व्याख्या कर सकता है, और क्वेरी Include()
के पद में क्या बयान देता है, इस पर कुछ उदाहरण प्रदान करते हैं SQL
?
मैंने बहुत शोध करने की कोशिश की, लेकिन मैं एक db आदमी से अधिक हूं - इसलिए MSDN में स्पष्टीकरण भी मेरे लिए कोई मतलब नहीं है। क्या कोई कृपया व्याख्या कर सकता है, और क्वेरी Include()
के पद में क्या बयान देता है, इस पर कुछ उदाहरण प्रदान करते हैं SQL
?
जवाबों:
उदाहरण के लिए मान लें कि आप अपने सभी ग्राहकों की सूची प्राप्त करना चाहते हैं:
var customers = context.Customers.ToList();
और मान लेते हैं कि प्रत्येक Customer
वस्तु में इसके सेट का एक संदर्भ है Orders
, और प्रत्येक Order
का संदर्भ है LineItems
जिसमें संदर्भ भी हो सकता है Product
।
जैसा कि आप देख सकते हैं, कई संबंधित संस्थाओं के साथ एक शीर्ष-स्तरीय ऑब्जेक्ट का चयन करने से एक क्वेरी हो सकती है जिसमें कई स्रोतों से डेटा खींचने की आवश्यकता होती है। एक प्रदर्शन उपाय के रूप में, Include()
आपको यह इंगित करने की अनुमति मिलती है कि डेटाबेस से संबंधित क्वेरी को उसी क्वेरी के भाग के रूप में पढ़ा जाना चाहिए।
एक ही उदाहरण का उपयोग करते हुए, यह सभी संबंधित आदेश हेडर में ला सकता है, लेकिन अन्य रिकॉर्ड में से कोई भी नहीं:
var customersWithOrderDetail = context.Customers.Include("Orders").ToList();
एसक्यूएल के लिए पूछे जाने के बाद से एक अंतिम बिंदु के रूप में, बिना Include()
साधारण कथन के पहला कथन उत्पन्न हो सकता है:
SELECT * FROM Customers;
अंतिम विवरण जो कॉल करता है Include("Orders")
वह इस तरह दिख सकता है:
SELECT *
FROM Customers JOIN Orders ON Customers.Id = Orders.CustomerId;
LineItems
और Products
, LINQ क्वेरी को इस तरह दिखना चाहिए var customersWithOrderDetail = context.Customers.Include("Orders").Include("LineItems").Include("Products").ToList();
:?
Include()
अंतर "पथ" के साथ वस्तुओं को पकड़ने के लिए कई कॉल को चेन कर सकते हैं । यदि आप एक ही पथ में ऑब्जेक्ट चाहते हैं, तो आपको केवल एक कॉल करना होगा जो पूरे पथ को निर्दिष्ट करता है। के बाद से LineItems
और Products
किसी भी पथ घटकों आप अलग कॉल की आवश्यकता है का हिस्सा नहीं है।
मैं बस यह जोड़ना चाहता था कि "शामिल करें" उत्सुक लोडिंग का हिस्सा है। यह Microsoft द्वारा एंटिटी फ्रेमवर्क 6 ट्यूटोरियल में वर्णित है। यहाँ लिंक है: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-use-mvc/reading-related-data-with-the -entity-ढांचे में एक-एएसपी निवल MVC-आवेदन
लिंक्ड पेज से अंश:
यहां कई तरीके दिए गए हैं कि एंटिटी फ्रेमवर्क संबंधित डेटा को किसी इकाई के नेविगेशन गुणों में लोड कर सकता है:
धीरे लोड हो रहा है। जब इकाई को पहली बार पढ़ा जाता है, तो संबंधित डेटा पुनर्प्राप्त नहीं किया जाता है। हालाँकि, पहली बार जब आप किसी नेविगेशन प्रॉपर्टी को एक्सेस करने का प्रयास करते हैं, तो उस नेविगेशन प्रॉपर्टी के लिए आवश्यक डेटा अपने आप पुनर्प्राप्त हो जाता है। डेटाबेस में भेजे गए कई प्रश्नों में यह परिणाम होता है - इकाई के लिए एक और प्रत्येक बार जब इकाई के लिए संबंधित डेटा पुनर्प्राप्त किया जाना चाहिए। DbContext वर्ग डिफ़ॉल्ट रूप से आलसी लोडिंग को सक्षम करता है।
उत्सुक लोड हो रहा है। जब इकाई को पढ़ा जाता है, तो संबंधित डेटा को इसके साथ पुनर्प्राप्त किया जाता है। यह आम तौर पर एक सिंगल ज्वाइन क्वेरी के परिणामस्वरूप होता है जो आवश्यक सभी डेटा को पुनः प्राप्त करता है। आप
Include
विधि का उपयोग करके उत्सुक लोडिंग निर्दिष्ट करते हैं ।लोडिंग स्पष्ट करें। यह आलसी लोडिंग के समान है, सिवाय इसके कि आप कोड में संबंधित डेटा को स्पष्ट रूप से पुनर्प्राप्त करते हैं; जब आप नेविगेशन प्रॉपर्टी पर पहुंचते हैं तो यह स्वचालित रूप से नहीं होता है। आप संबंधित डेटा को एक इकाई के लिए ऑब्जेक्ट स्टेट मैनेजर प्रविष्टि प्राप्त करके और संग्रह के लिए Collection.Load विधि या एक इकाई रखने वाली संपत्तियों के लिए Reference.Load विधि को कॉल करके मैन्युअल रूप से लोड करते हैं। (निम्नलिखित उदाहरण में, यदि आप प्रशासक नेविगेशन संपत्ति को लोड करना चाहते हैं, तो आप के
Collection(x => x.Courses)
साथ बदल देंगेReference(x => x.Administrator)
।) आमतौर पर आप स्पष्ट लोडिंग का उपयोग केवल तब करेंगे जब आप आलसी लोडिंग बंद कर देंगे।क्योंकि वे संपत्ति मूल्यों को तुरंत प्राप्त नहीं करते हैं, आलसी लोडिंग और स्पष्ट लोडिंग दोनों को आस्थगित लोडिंग के रूप में भी जाना जाता है।
इसे एगर-लोडिंग को एक ऐसे परिदृश्य में लागू करने के बारे में सोचें, जहां आप उप-आइटम अन्यथा आलसी-लोडिंग होंगे।
क्वेरी ईएफ डेटाबेस में भेज रहा है, पहली बार में एक बड़ा परिणाम देगा, लेकिन शामिल वस्तुओं का उपयोग करते समय कोई अनुवर्ती प्रश्न नहीं किया जाएगा।
दूसरी ओर, इसके बिना, ईएफ बाद में सेपरेट प्रश्नों का निष्पादन करेगा, जब आप पहली बार उप-आइटम का उपयोग करते हैं।