2013-03-31 14 views
7

मैं एमवीसी पर एक पुस्तक से कुछ LINQ उदाहरणों के माध्यम से जा रहा हूं और मुझे आश्चर्य है कि नीचे दिए गए चयन कॉल का उद्देश्य क्या हो सकता है। शायद यह एक टाइपो है लेकिन मुझे पुस्तक की इरेटा में इसका कोई उल्लेख नहीं दिख रहा है।LINQ का संभावित उद्देश्य (x => x)

foreach(Product p in products 
    .Where(e => e.Name == productParam.Name) 
    .Select(e => e)) { 
     p.Price = productParam.Price; 
} 

मैं इस जहां .Select (ई => ई) शामिल किया गया था और एक जहाँ यह नहीं था के दो उदाहरण बाहर का परीक्षण किया और कोड एक ही है। चूंकि भविष्यवाणी द्वारा अनुमानित आईन्यूमेरेबल कहां लौटाता है, तब चयन कॉल (उपरोक्त विशिष्ट भविष्यवाणी के साथ) कब आवश्यक होगा? क्या यह वास्तव में कुछ भी करता है? क्या यह कुछ अजीब कोने मामले में हो सकता है?

+0

केवल एक चीज जिसे मैं सोच सकता हूं वह है यदि आपने सामान्य तर्कों को स्पष्ट रूप से परिभाषित किया है और वापसी मूल्य स्रोत से एक पूर्ण रूप से परिवर्तनीय मूल्य था। आप डिबगिंग के लिए ब्रेकपॉइंट्स को भी शामिल कर सकते हैं (शायद आपको घुंघराले ब्रेसिज़ और उस के लिए एक नई लाइन की आवश्यकता होगी)। लेकिन उन लोगों के अलावा (विशेष रूप से जिनमें से कोई भी आपके द्वारा पोस्ट किए गए कोड में वास्तव में नहीं होता है), मैं इसके लिए किसी भी सार्थक उद्देश्य के बारे में नहीं सोच सकता। शायद लिंक क्वेरी वाक्यविन्यास से आलसी रूपांतरण? –

+0

यह वास्तव में एक आम गलती है। सब कुछ पर ToList slapping भी अधिक आम है। आम तौर पर लोग LINQ प्रश्नों के निष्पादन मॉडल को पूरी तरह समझ नहीं पाते हैं (जो समझ में आता है)। – usr

+0

@usr मेरी इच्छा है कि वहां एक (मानक) 'फोर्स' एक्सटेंशन था .. कई बार ऐसे होते हैं जब IQuerable/IEnumerable का मूल्यांकन मजबूर होना चाहिए, भले ही आप वास्तव में किसी सूची में रुचि न लें। नाम वांछित ऑपरेशन के रूप में इसे और अधिक स्पष्ट कर देगा। –

उत्तर

9

यह ठीक उसी चीज़ को वापस करेगा, इसके बिना IEnumerable<T>। यह वास्तव में अच्छा से अधिक नुकसान कर रहा है हालांकि यह एक अनावश्यक ओ (एन) ऑपरेशन (पूरी सूची के माध्यम से लूपिंग) कर रहा है।

संदर्भ

+1

बिल्कुल नहीं - यह IQueryable वापस करेगा। लेकिन अन्यथा आप सही हैं, आपको वही चीज़ मिलती है जैसे चयन अभिव्यक्ति के बिना। – chris

+1

संख्यात्मक पर परिभाषा के आधार पर। संदर्भ पृष्ठ का चयन करें जो है "अनुक्रम के प्रत्येक तत्व को एक नए रूप में प्रोजेक्ट करता है।" और तथ्य यह है कि प्रक्षेपण एक ही समान रूप है, ऐसा लगता है कि यह यहां कोई उद्देश्य नहीं देता है। – seangwright

+0

@DanielImms यदि उत्पाद एक 'IQueryable' है तो चयन कॉल अधिकांश प्रदाताओं पर ओ (1) के रूप में समाप्त हो जाएगा क्योंकि यह कुछ भी नहीं करता है। <- यह सिर्फ नाइटपिकिंग है। आपका जवाब अच्छा है और मैंने इसे ऊपर उठाया। – usr

5

यह वास्तव में कुछ भी करता है?

यह पूरे ऑपरेशन में ओवरहेड जोड़ता है। हकीकत में, इसे हटा दिया जाना चाहिए, क्योंकि यह कोई उपयोगी उद्देश्य नहीं देता है।

3

मुझे लगता है कि लेखक सिर्फ यह दिखाना चाहता था कि LINQ क्वेरी SQL कथन के समान कैसे हैं। इस मामले में, यह स्पष्ट रूप से आवश्यक नहीं है क्योंकि यह पहचान फ़ंक्शन का उपयोग करता है और छोड़ा जा सकता है। हालांकि SQL में select खंड होने की आवश्यकता है। इसे वहां रखना गलत नहीं है, लेकिन इसकी निश्चित रूप से आवश्यकता नहीं है।

हालांकि सामान्य रूप से, पहचान चयन कॉल होने पर हमेशा एक बुरी चीज नहीं होती है, खासकर अगर किसी फ़ंक्शन में क्वेरी वापस आ रही है। यह आपको उस संग्रह के केवल पढ़ने के दृश्य को देखने में मदद कर सकता है जिसे आप वापस करना चाहते हैं। लेकिन यह इस मामले में लागू नहीं होता है क्योंकि क्वेरी तुरंत गणना की जा रही है।

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