2010-10-08 17 views
7

मुझे एहसास है कि यह आंशिक रूप से व्यक्तिपरक है, लेकिन मैं आम तौर पर समुदाय की राय के रूप में उत्सुक हूं और इस मुद्दे को हल करने वाले मौजूदा प्रश्न को सफलतापूर्वक ढूंढने में सक्षम नहीं हूं।एक विस्तार विधि में एक लैम्ब्डा कब करता है?

मैं एल 2 ईएफ क्वेरी में एक विशेष चयन कथन के बारे में एक साथी सहकर्मी के साथ कुछ हद तक धार्मिक बहस में हूं।

.Select(r => 
{ 
    r.foo.Bar = r.bar; 
    r.foo.Bar.BarType = r.Alpha; 
    if (r.barAddress != null) 
    { 
     r.foo.Bar.Address = r.barAddress; 
     r.foo.Bar.Address.State = r.BarState; 
    } 
    if (r.baz != null) 
    { 
     r.foo.Bar.Baz = r.baz; 
     if (r.bazAddress != null) 
     { 
      r.foo.Bar.Baz.Address = r.bazAddress; 
      r.foo.Bar.Baz.Address.State = r.BazState; 
     } 
    } 
    return r.foo; 
}) 

चेतावनियां:

  • यह वह जगह है Linq करने वाली संस्थाओं
  • यह डीबी में काम करने के बाद के रूप में प्रदर्शन किया गया और
  • लौटे इनपुट पैरामीटर r अनाम है

व्यक्तिगत रूप से, मैं राय के बारे में हूं (ए) चयन खंड को मूल्यों में बदलाव नहीं करना चाहिए, इसे केवल प्रोजेक्ट करना चाहिए। उनका काउंटर तर्क यह है कि वह कुछ भी नहीं बदल रहा है, वह सिर्फ यह सुनिश्चित कर रहा है कि डीबी क्वेरी के परिणामस्वरूप सब ठीक से शुरू हो गया है। दूसरा, मुझे लगता है कि एक बार जब वह पूर्ण कोड ब्लॉक और वापसी विवरणों में प्रवेश करना शुरू कर देता है, तो यह एक विधि या Func<T, U> को परिभाषित करने का समय है और इन सभी इनलाइनों को नहीं करता है। यहां पर शिकायतकर्ता, फिर से, इनपुट अज्ञात है, इसलिए एक प्रकार को परिभाषित करने की आवश्यकता होगी। लेकिन फिर भी, अगर हम विशिष्ट नहीं हैं तो भी हम सामान्य बिंदु पर बहस कर रहे हैं।

तो, लैम्ब्डा अभिव्यक्ति कब बहुत अधिक होती है? आप रेत में अस्पष्ट रेखा कहां खींचते हैं?

+0

ऐसा लगता है कि कोड की जटिलता अज्ञात प्रकार की जटिलता का पालन करती है; वास्तव में एक जटिल अज्ञात प्रकार वास्तव में आवश्यक है? –

+0

@Dan, वास्तविक क्वेरी में 8 अलग-अलग इकाइयों में जाने के बाएं शामिल हैं, अज्ञात प्रकार के साथ केवल उन इकाइयों की वस्तुओं को शामिल किया गया है। यह एक जटिल अज्ञात प्रकार नहीं है, प्रति से, यह केवल अपरिभाषित है। यह 'नया चुनें {foo, bar, baz,/* आदि * /} ' –

+0

यह स्पष्ट रूप से साइड इफेक्ट्स के साथ एक चयन है। काफी इरादा नहीं है। इसके लिए, 'foreach(); 'है। – Dykam

उत्तर

2

मेरा पहला वृत्ति मुख्य रूप से आकार और जटिलता के मामले में आपके साथ सहमत होना है।

हालांकि, इसका उपयोग किसी संदर्भ में किया जाता है जहां यह (या कभी-कभी) .NET कोड के अलावा किसी अन्य चीज़ के रूप में निष्पादित किया जाएगा (विशेष रूप से यदि यह SQL क्वेरी के हिस्से में बदल जाता है), तो मैं बहुत कुछ बन जाऊंगा इसके सहिष्णु

तो, कि जहां मैं फजी रेखा खींचना, और यह भी कारण है कि मैं इसे फिर से) को स्थानांतरित :)

1

मैं भी एक का चयन करें (सहमत प्रक्षेपण के लिए इस्तेमाल करना चाहिए। मैं बजाय "लेट" कीवर्ड का उपयोग पहले से जांच करने के लिए देखता हूं ताकि चयन() में उस प्रक्षेपण को साफ रखा जा सके। यह "let" का उपयोग कर चर (ओं) सेट को संदर्भित करने के लिए चयन() को सक्षम करेगा।

1

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

राज्य परिवर्तन के लिए ... अच्छा, यहां वह मूल्यों को शुरू कर रहा है। मैं केवल चिंतित हूं अगर यह लैम्ब्डा के बाहर कुछ चर के लिए राज्य असाइन कर रहा था, लेकिन यह आर के सभी प्रारंभिकरण है, इसलिए यह मेरे लिए ठीक लगता है।

1

मुझे यह देखने से पहले मुझे थोड़ी देर के लिए देखना था कि मुझे क्या परेशान कर रहा है।

  1. इसे एक रिफैक्टर की आवश्यकता है।

  2. तथ्य यह है कि मुझे लम्बा के इरादे को पढ़ने में लंबा लगा।

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

0

आपको अपने अन्य विकल्पों में कारक रखना होगा ... क्या तर्क को रखने के लिए एक बेहतर जगह है। किसी भी तरह से, आप LINQ में, या फोरैच लूप में प्रत्येक इकाई के माध्यम से उस अतिरिक्त काम को करने के लिए लूप कर रहे हैं ... जब तक कि आप इसे अपनी खुद की विस्तार विधि में दोबारा नहीं बदलना चाहते हैं, तो मैं कहूंगा कि यह काम करता है या नहीं।

दृश्यमान रूप से, यह गन्दा नहीं है, इसलिए यह एक प्लस है। या, आप देख सकते हैं कि चलो कीवर्ड (मूल रूप से एक सबक्वायरी) आपको कुछ और खरीदता है या नहीं।

0

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

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