LINQ में क्या शामिल है () है?


93

मैंने बहुत शोध करने की कोशिश की, लेकिन मैं एक db आदमी से अधिक हूं - इसलिए MSDN में स्पष्टीकरण भी मेरे लिए कोई मतलब नहीं है। क्या कोई कृपया व्याख्या कर सकता है, और क्वेरी Include()के पद में क्या बयान देता है, इस पर कुछ उदाहरण प्रदान करते हैं SQL?


बहुत ही बुनियादी, मैं केवल सरल चयन, कहाँ, आदेश से, कुछ समग्र opperators पता है। मैंने LINQ में JOIN करने की कोशिश नहीं की है, और न ही शामिल करें। मेरा अंतिम लक्ष्य इन LINQ Queries को SQL
CJ

जवाबों:


165

उदाहरण के लिए मान लें कि आप अपने सभी ग्राहकों की सूची प्राप्त करना चाहते हैं:

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;

1
धन्यवाद। आपके उदाहरण का उपयोग करते हुए, क्या मैं कह सकता हूं कि क्या मैं भी शामिल करना चाहता हूं LineItemsऔर Products, LINQ क्वेरी को इस तरह दिखना चाहिए var customersWithOrderDetail = context.Customers.Include("Orders").Include("LineItems").Include("Products").ToList();:?
सीजे

2
हां, आप Include()अंतर "पथ" के साथ वस्तुओं को पकड़ने के लिए कई कॉल को चेन कर सकते हैं । यदि आप एक ही पथ में ऑब्जेक्ट चाहते हैं, तो आपको केवल एक कॉल करना होगा जो पूरे पथ को निर्दिष्ट करता है। के बाद से LineItemsऔर Productsकिसी भी पथ घटकों आप अलग कॉल की आवश्यकता है का हिस्सा नहीं है।
युक

क्या इसे शामिल करना अनिवार्य है? मुझे पूरा यकीन है कि मैंने उन समाधानों पर काम किया है जहाँ मुझे इसका उपयोग किए बिना संबंधित वस्तुएं मिल सकती हैं।
जेपजेन

@ जेपज़ेन यह निर्भर करता है कि आप आलसी-भरी संस्थाओं का उपयोग कर रहे हैं या नहीं।
युकर

@ हां, मेरा मानना ​​है कि जब आप आलसी-लोडिंग का उपयोग कर रहे हैं तो यह काम करता है, उत्सुक लोडिंग के मामले में, आपको "शामिल" कथन का उपयोग करने की आवश्यकता नहीं है, लेकिन यह निश्चित रूप से प्रदर्शन के मुद्दों का परिणाम देगा। कृपया मुझे इस पर सुधार करें।
सैम

27

मैं बस यह जोड़ना चाहता था कि "शामिल करें" उत्सुक लोडिंग का हिस्सा है। यह 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)।) आमतौर पर आप स्पष्ट लोडिंग का उपयोग केवल तब करेंगे जब आप आलसी लोडिंग बंद कर देंगे।

क्योंकि वे संपत्ति मूल्यों को तुरंत प्राप्त नहीं करते हैं, आलसी लोडिंग और स्पष्ट लोडिंग दोनों को आस्थगित लोडिंग के रूप में भी जाना जाता है।


3
SO =) में आपका स्वागत है। बस एक सुझाव है, लेकिन जब आप कुछ ऐसा उत्तर दे रहे हैं, यदि आप कर सकते हैं, तो एक कोड स्निपेट भी शामिल है। लिंक दुर्भाग्य से मृत हो सकते हैं।
the_Cthulhu_Kid

2

इसे एगर-लोडिंग को एक ऐसे परिदृश्य में लागू करने के बारे में सोचें, जहां आप उप-आइटम अन्यथा आलसी-लोडिंग होंगे।

क्वेरी ईएफ डेटाबेस में भेज रहा है, पहली बार में एक बड़ा परिणाम देगा, लेकिन शामिल वस्तुओं का उपयोग करते समय कोई अनुवर्ती प्रश्न नहीं किया जाएगा।

दूसरी ओर, इसके बिना, ईएफ बाद में सेपरेट प्रश्नों का निष्पादन करेगा, जब आप पहली बार उप-आइटम का उपयोग करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.