2011-03-07 8 views
5

मेरे पास रिपोर्ट के लिए कुछ मानों की गणना करने के लिए linq प्रश्नों का निम्न ब्लॉक है।मेरे linq प्रश्नों के मान तुरंत क्यों दिखाई नहीं देते हैं?

var items = (from trans in calclabordb.Sales_Transactions     
      select trans).SelectMany(st => st.Sales_TransactionLineItems).Where(stli => stli.TypeID == typeID); 

decimal test = items.Where(stli => stli.Inventory_Item is Base).Sum(stli => (decimal?)stli.Inventory_Item.IntExtraServiceAmount) ?? 0; 
decimal test2 = items.Where(stli => stli.Inventory_Item is Extra).Sum(stli => (decimal?)stli.ItemPrice) ?? 0; 
decimal test3 = test + test2; 
current.ExtraSales = items.Where(stli => stli.Inventory_Item is Base).Sum(stli => (decimal?)stli.Inventory_Item.IntExtraServiceAmount) ?? 0 + 
    items.Where(stli => stli.Inventory_Item is Extra).Sum(stli => (decimal?)stli.ItemPrice) ?? 0; 

मैंने डीबगर में कोड के माध्यम से कदम रखा है और मैंने कुछ विषमताएं देखी हैं। test में बताए जाने के बाद अपने मूल्य ExtraSalesExtraSales == 11.31 में बताए के बाद test == 11.31test2 == 11.28 और test3 == 22.59 test3 में बताए के बाद test2test2 == 0 और test == 11.31 में बताए जाने के बाद 0. है। ExtraSales में मान जब यह पूरा हो जाए तो 22.5 9 होना चाहिए। यहाँ क्या चल रहा है?

संपादित करें: मैंने ExtraSales में असाइनमेंट के बाद अतिरिक्त लाइनें जोड़ दी हैं लेकिन मान परिवर्तित नहीं होता है।

उत्तर

22

जवाब है कि कहना है कि यह एक आस्थगित निष्पादन समस्या है गलत हैं। यह एक ऑपरेटर प्राथमिकता समस्या है।

वहां से पूरी तरह से अप्रासंगिक और असंभव-पढ़ने वाले कोड से छुटकारा पाएं। यह सब लाल हेरिंग है। प्रासंगिक रेप्रो है:

decimal? d1 = 11.31m; 
decimal? d2 = 11.28m; 
decimal test1 = d1 ?? 0m; 
decimal test2 = d2 ?? 0m; 
decimal test3 = test1 + test2; 
decimal test4 = d1 ?? 0m + d2 ?? 0m; 

अंतिम पंक्ति का अर्थ क्या है? क्या इसका मतलब यह है कि इससे पहले की रेखा?

नहीं, ऐसा नहीं है। इसके अलावा ऑपरेटर उच्च पूर्वता अशक्त कोलेसिंग ऑपरेटर से है, इसलिए इस

decimal test4 = d1 ?? (0m + d2) ?? 0m; 

कोड आप ने लिखा का अर्थ है "d1 का मूल्य का उत्पादन करता है, तो d1 अशक्त नहीं है। यदि d1 रिक्त है और 0m + d2 है शून्य नहीं तो 0 एम + डी 2 के मूल्य का उत्पादन करें। यदि 0 एम + डी 2 शून्य है तो मूल्य 0 मीटर का उत्पादन करें। "

(आप शायद यह नहीं जानते कि ?? ऑपरेटर के पास यह सुखद चेनिंग संपत्ति है। सामान्यतः, a ?? b ?? c ?? d ?? e आपको ए, बी, सी या डी, और ई का पहला गैर-शून्य मान देता है यदि वे अन्यथा सभी शून्य हैं जब तक आप चाहें श्रृंखला बना सकते हैं। यह काफी सुरुचिपूर्ण छोटा ऑपरेटर है।)

चूंकि डी 1 शून्य नहीं है, इसलिए हम इसका मूल्य बनाते हैं और test4 को डी 1 का मान सौंपा जाता है।

आप शायद कहते हैं कि करने के लिए होती:

decimal test4 = (d1 ?? 0m) + (d2 ?? 0m); 

यदि आप मतलब है "d1 या d2 अशक्त हो सकता है, और यदि या तो है, तो शून्य के रूप में अशक्त एक इलाज"।तो 12 + 2 से 14, 12 + अशक्त 12 है, अशक्त + अशक्त 0

है, तो आप मतलब है "या तो d1 और d2 अशक्त हो सकता है, और अगर या तो अशक्त तो मैं शून्य चाहते है", कि

है
decimal test4 = (d1 + d2) ?? 0m; 

तो 12 + 2 से 14, 12 + अशक्त 0 है, अशक्त + अशक्त 0

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

+0

एक समर्थक की तरह उत्तर दिया। –

+0

आप जानते हैं कि मुझे बेहतर जाना चाहिए था। मैंने अतीत में उस परिस्थिति की समस्या को एक परिदृश्य में चलाया है जहां ?? कुछ अन्य ऑपरेटर की तुलना में अधिक प्राथमिकता थी। ऐसा लगता है कि डीबगर ने मुझे भ्रामक जानकारी दी है। – Mykroft

-1

हाँ, यह आस्थगित निष्पादन कहा जाता है और यह चीजें हैं जो वास्तव में शक्तिशाली हो सकता है में से एक है, लेकिन यह भी आप ट्रिप अगर आप इसे उम्मीद नहीं कर रहे हैं ...

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

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