2012-02-27 5 views
11

के साथ स्वचालित संबंधों की स्वचालित रूप से जांच कर रहा है मैं उस एप्लिकेशन के लिए डेटाबेस क्वेरीिंग को संभालने के लिए LINQ से SQL का उपयोग कर रहा हूं, जिस पर मैं काम कर रहा हूं।LINQ क्वेरी

इस उदाहरण के प्रयोजनों के लिए, कल्पना मैं इतना

- Company 
- Product 
- Item 
- Order 

जैसे कुछ टेबल है और कहते हैं कि एक Company 0 या अधिक Products है की सुविधा देता है, एक Product 0 या अधिक Items है, और एक Item 0 है या अधिक Orders

अब तो मैं Orders की एक सूची प्राप्त किया है की सुविधा देता है, कुछ की तरह:

IQueryable<Order> myOrders = GetMyOrders(); 

अब कहते हैं कि मैं एक विशेष Company.Name के लिए आदेश क्वेरी, लेकिन एक स्थिति है जहां हर तालिका अभिभावक आईडी हो सकता है करना चाहते हैं NULL (मैं जानता हूँ कि यह मेरा उदाहरण डेटा के साथ तार्किक नहीं लगता है, लेकिन यह सिर्फ एक उदाहरण है)

धारणा बनाना कोई NULL माता पिता आईडी देखते हैं कि मैं यह कर सकता है:

var filteredOrders = myOrders.Where(x => x.Item.Product.Company.Name == "Company1"); 

यह ठीक काम करेगा, क्योंकि NULL मूल आईडी मान हो सकते हैं, मुझे यह सुनिश्चित करने के लिए प्रत्येक पैरेंट ऑब्जेक्ट की जांच करनी होगी कि यह अगले माता-पिता से पूछताछ करने से पहले null नहीं है (अन्यथा मुझे अपवाद मिलेगा)। इसलिए मैं कुछ ऐसा कार्य करें:

var filteredOrders = myOrders.Where(x => 
    x.Item != null && 
    x.Item.Product != null && 
    x.Item.Product.Company != null && 
    x.Item.Product.Company.Name == "Company1"); 

तो मेरे सवाल का: वहाँ एक बेहतर तरीका (पठनीयता और कोडिंग में आसानी के संदर्भ में) सभी रिक्त चेकों शामिल करने के लिए की तुलना में यह करने के लिए है? रास्ते में पाए गए किसी भी शून्य माता-पिता को परिणामस्वरूप सूची से बहिष्कार करना चाहिए।

कृपया अशक्त माता-पिता को रोकने के लिए कोई सुझाव नहीं, डेटाबेस नहीं बदलेंगे, (और वैसे भी पूरी तरह से वैध है)

+0

और अधिक प्रदर्शन करने वाले के रूप में बेहतर पढ़ सकते हैं? मुझे ऐसा नहीं लगता। मैं वैसे भी नहीं सोच सकता कि आप उन सभी 'शून्य' चेक से खुद को छुटकारा पा सकते हैं। सुंदर कोड के रूप में बेहतर है? मैं लोन्ली-लोकली के सुझाव के साथ जाऊंगा। – InBetween

+0

@InBetween: क्षमा करें, जब मैं बेहतर कहता हूं तो मुझे पठनीयता के लिए और अधिक मतलब था। लेकिन Lonli-lokli पद, जहां मैं अंत में यह एक SQL क्वेरी के रूप में चलाने की है, वांछित और पहले सभी परिणाम – musefan

+0

भीतरी मिलती है के लिए एक आदर्श आवेदन है, जो अशक्त संदर्भ के साथ सभी तत्वों eleminate होगा की तरह लगता है वापस नहीं उल्लेख करने के लिए मेरी टिप्पणी को ध्यान में रखकर । सभी तालिकाओं में शामिल हों और परिणाम कंपनी के नाम से फ़िल्टर करें। (लेकिन यह और अधिक पठनीय नहीं होगा) – Stephan

उत्तर

3

वहाँ जाना जाता है pattren (अशक्त वस्तु पैटर्न देखें)। इसके अलावा आप this article

+1

मैं उस लेख के लिए पठन पड़ा है मौजूद नहीं है और यह निश्चित रूप से दिलचस्प था दे देंगे। हालांकि, मेरे उपयोग के कारण मैं सोच रहा हूं कि यह मेरे लिए उपयुक्त होगा या नहीं। अपने सुझाव मान लिया जाये कि एक विस्तार विधि बनाने के लिए है, मुझे डर है कि मैं इस IQueryable उपयोग कर रहा हूँ और सभी परिणामों पर क्वेरी को निष्पादित नहीं करना चाहती में मेरे लिए एक बड़ा प्रदर्शन हिट होगा। मैं निश्चित रूप से यह सोचते हैं रहा हूँ मैं (एक सूची बजाय साथ उदाहरण के काम) यह करने के लिए होता है - इस के साथ हो सकता है मन मैं चीजों को लंबा रास्ता तय करना क्या करने वाले के साथ छोड़ दिया हूँ है ... किसी भी विचार? – musefan

+0

फिर आपको linq-to-sql प्रदाता का अपना कार्यान्वयन लिखना चाहिए और ऊपर दिए गए सुझावों जैसे एसक्यूएल प्रश्नों में उन एक्सटेंशन विधियों को गठबंधन करना चाहिए। या आप केवल उन प्रश्नों को स्क्रैच से लिख सकते हैं। –