2010-01-27 13 views
5

जूनियर डेवलपर के रूप में आपने जो चीजें आपको पीटा है उनमें से एक यह है कि आपने कभी भी डेटा सेट पर "चयन *" नहीं किया है, क्योंकि यह कई कारणों से अविश्वसनीय है।लिंक नो-नोस - कैच सभी एसक्यूएल-जैसे चयन करें?

लिंक पर जाने के बाद (पहली बार लिंक से एसक्यूएल और फिर इकाई फ्रेमवर्क), मैंने सोचा है कि क्या लिंक समकक्ष समान रूप से डूब गया है?

जैसे

var MyResult = from t in DataContext.MyEntity 
       where t.Country == 7 
       select t; 

हम सिर्फ खेतों हम स्पष्ट रूप से उल्लेख किया चाहते हैं के साथ एक अनाम प्रकार में का चयन किया जाना चाहिए, या पकड़ सब अब अतिरिक्त सामान की वजह से LinqToSql एट अल के लिए स्वीकार्य चयन डेटा वे आसपास है प्रदान करें?

सादर

मू

+2

जो लोग आपको कहते हैं कि * कभी *, * कभी * $ x नहीं करना चाहिए, जो हमेशा ** $ ** करते हैं। –

+0

ओह, मैं पूरी तरह से सहमत हूं, लेकिन यह * सुनहरा नियमों में से एक है ... – Moo

उत्तर

5

यह आपके उपयोग के मामले द्वारा निर्धारित नहीं है, यह अस्वीकार नहीं है। यदि आप परिणाम अपडेट करना चाहते हैं और इसे जारी रखना चाहते हैं तो आपको t चुनना चाहिए, हालांकि यदि आप ऐसा नहीं करना चाहते हैं और केवल प्रदर्शन उद्देश्यों के लिए पूछताछ कर रहे हैं तो आप अपनी इच्छित संपत्तियों का चयन करके इसे और अधिक कुशल बना सकते हैं:

var MyResult = from t in DataContext.MyEntity 
       where t.Country == 7 
       select new { t.Prop1, t.Prop2 }; 

यह कुछ कारणों से है। किसी अज्ञात प्रकार की आबादी थोड़ा तेज़ है, लेकिन अधिक महत्वपूर्ण बात यह disables change tracking ... क्योंकि आप किसी अनाम प्रकार को जारी नहीं रख सकते हैं, इसमें परिवर्तनों को ट्रैक करने की कोई आवश्यकता नहीं है।

Here's an excellent rundown of the common performance areas like this यह शुरू होने पर बढ़िया है। इसमें परिवर्तन ट्रैकिंग की एक और गहराई से स्पष्टीकरण शामिल है जिसे मैंने अभी भी वर्णित किया है।

1

select t इस मामले रों एक ज्ञात प्रकार से सभी क्षेत्रों के चयन में। यह दृढ़ता से टाइप किया गया है और एसक्यूएल में मिली त्रुटियों के अधीन कम है।

एसक्यूएल

INSERT INTO aTable 
SELECT * FROM AnotehrTable 

में

उदाहरण के लिए विफल हो सकता है यदि AnotherTable बदल गया है, लेकिन Linq/नेट में इस स्थिति प्रकट नहीं होता है।

यदि आप एकाधिक तालिकाओं में शामिल हो रहे हैं, तो आप लिंक में select * नहीं कर सकते हैं, आपको भीतर के सभी प्रकार के साथ एक अनाम प्रकार बनाना होगा।

0

मैं कहूंगा कि आप क्या कर रहे हैं SELECT * कथन के बराबर है। केवल उन फ़ील्ड को वापस करना बेहतर है जिन्हें आप चाहते हैं उदा।

var myResult = from t in DataContext.MyEntity 
       where t.Country == 7 
       select new T 
       { 
        Field1 = t.Field1, 
        Field2 = t.Field2 
       } 
+0

क्या होगा यदि आप मायनेटी में हर चीज चाहते थे? क्या आप MyEntity के समान अनाम प्रकार बनायेंगे? – cjk

+1

मैंने सोचा होगा (परीक्षण नहीं किया गया) कि ओपी के सुझाव के रूप में टी लौटने पर, यह आपके लिए क्या करेगा? – James

0

आपको अभी भी स्पष्ट रूप से यह बताना चाहिए कि आप क्या चुनना चाहते हैं। यदि आप सभी का चयन करते हैं, तो भी आप अपनी जरूरत से कहीं अधिक डेटा खींच रहे हैं और जैसे ही नई चीजें जोड़ दी गई हैं, आप अनावश्यक रूप से उनको भी खींचेंगे। आम तौर पर, केवल वही अभ्यास करना है जो आपको चाहिए।

0

LINQ का उपयोग अतिरिक्त फ़ील्ड प्राप्त करने के प्रदर्शन हिट को कम नहीं करेगा।

हालांकि, यह असंभव है जो LINQ से SQL का उपयोग करके SELECT * FROM ... उत्पन्न करने के लिए है। आपका कोड SELECT कथन उत्पन्न करेगा जो आपके मॉडल में परिभाषित सभी कॉलम स्पष्ट रूप से नामित करता है; यह डेटाबेस में किसी भी बदलाव को अनदेखा कर देगा।

हालांकि, प्रदर्शन अभी भी एक चिंता है, इसलिए यदि आप केवल कुछ कॉलम का उपयोग कर रहे हैं तो आपको एक अनाम प्रकार का उपयोग करना चाहिए।

0

उदाहरण के रूप में ऐसा करना आवश्यक हो सकता है, खासकर यदि क्या करने की आवश्यकता है तो पंक्ति में परिवर्तन है।

एसक्यूएल चयन में * linq से अलग है क्योंकि linq हमेशा कॉलम की समान संख्या (जैसा कि डीबीएमएल में परिभाषित किया गया है) वापस कर देगा।

1

SELECT * से बचने का कारण यह है कि अंतर्निहित डेटाबेस बदल सकता है और इसलिए कॉलम ऑर्डर बदल सकते हैं जिसके परिणामस्वरूप आपकी डेटा एक्सेस लेयर में बग हो सकती है।

आप अपने डेटाबेस से एक चयन * नहीं कर रहे हैं, आप बस इतना कह रहे हैं कि आप "टी" और इसके साथ चलने वाली हर चीज चाहते हैं। इसके साथ कुछ भी गलत नहीं है अगर यह वास्तव में आपको चाहिए।

संबंधित मुद्दे