2009-08-24 10 views
13

मैं एक LINQ क्वेरी है कि इस तरह दिखता है रहे हैं ...एक LINQ योग वापसी अशक्त बनाने के लिए करता है, तो इसे यूं मान सभी अशक्त

var duration = Level3Data.AsQueryable().Sum(d => d.DurationMonths); 

यदि सब d.DurationMonths मान हैं अशक्त योग 0 देता है। मैं Sum वापसी null कैसे कर सकता हूं यदि सभी d.DurationMonthsnull हैं? या क्या मुझे राशि करने से पहले इस स्थिति को खत्म करने के लिए पहले एक अलग क्वेरी चलाने की ज़रूरत है?

+0

अवधि मॉन्थ्स का प्रकार क्या है? int 'Nullable '? –

+0

अवधि महीनों int है? –

उत्तर

11
एक विस्तार विधि के लिए पिछले सुझाव के साथ साथ

- यदि आप एक त्रिगुट ऑपरेटर इस्तेमाल कर सकते हैं ...

var duration = Level3Data.AsQueryable().Any(d => d.DurationMonths.HasValue) 
       ? Level3Data.AsQueryable().Sum(d => d.DurationMonths) 
       : null; 
+6

यह क्वेरी परिणाम दो बार बताती है ... –

+2

हालांकि यह परिणाम दो बार गिनती करता है, मेरे संग्रह छोटे हैं और मुझे यह सबसे अधिक पठनीय लगता है। तो इसे स्वीकार कर लिया है। सबको धन्यवाद। –

1

अकेले योग का उपयोग करना, यह असंभव है।

var q = Level3Data.AsQueryable(); 
var duration = q.All(d => d.DurationMonths == null) 
        ? null 
        : q.Sum(d => d.DurationMonths); 
+0

बह, बहुत देर से एक मिनट से भी कम। लॉल –

3

आप Aggregate उपयोग कर सकते हैं कस्टम एकत्रीकरण कोड प्रदान करने के लिए:

var items = Level3Data.AsQueryable(); 
var duration = items.Aggregate<D,int?>(null, (s, d) => (s == null) ? d.DurationMonths : s + (d.DurationMonths ?? 0)); 

(Level3Data में आइटम संभालने आप अपने प्रश्न में संकेत के रूप में, आप इससे पहले कि आप योग कहते हैं इस स्थिति के लिए जाँच करने की आवश्यकता होगी प्रकार D)

+0

'+ =' वास्तव में केवल '+' होना चाहिए। – GSerg

+0

@GSerg, निश्चित, धन्यवाद! –

-1

के हैं तो आपके पास दो प्रश्नों के बिना परिणाम चाहते हैं, तो कोशिश:

var अवधि = Level3Data.AquQueryable()। योग (डी => (डबल?) डी। अवधि मॉन्थ्स);

आप शून्य इस क्वेरी उपयोग के परिणाम के रूप अशक्त के बजाय चाहते हैं:।

वर अवधि = Level3Data.AsQueryable() जोड़ (? घ => (डबल) d.DurationMonths) ?? 0;

+0

मुझे व्यक्तिगत रूप से इस विकल्प को सबसे ज्यादा पसंद है। – TravisWhidden

+3

यदि ['अवधि मॉन्थ '' int है?'] (Http://stackoverflow.com/questions/1322544/how-to-make-a-linq-sum-return-null-if-the-summed-values-are -all-null # comment1156228_1322544) और सभी मान 'शून्य 'हैं, Linq2Sql' Sum' के लिए 'null' वापस कर देगा, और Linq2Objects' 0' वापस आ जाएंगे। ओपी को '0' वापस लौटा दिया गया है, इसलिए वे लिंक 2 ऑब्जेक्ट्स का उपयोग कर रहे हैं, जिसमें मामले को' डबल नहीं 'करने से पहले कास्टिंग किया जाएगा [काम नहीं करेगा] (http://stackoverflow.com/questions/1322544/how-to-make- एक-linq-sum-return-null-if-the-summed-values-are-all-null # comment69281108_16441725) और परिणाम अभी भी '0' होगा। – GSerg

3
var outputIndicatorSum = (from OutputIndicatorTable in objDataBaseContext.Output_Indicators 
              where OutputIndicatorTable.Output_Id == outputId 
              select (int?)OutputIndicatorTable.Status).Sum(); 
       int outputIndicatorSumReturn = Convert.ToInt32(outputIndicatorSum); 
       return outputIndicatorSumReturn; 

आप स्पष्ट रूप से कास्ट गैर-शून्य रहित व्यवहार्यता को शून्य प्रकार में टाइप कर सकते हैं। i.e, select (int?)OutputIndicatorTable.Status).Sum();

+1

यह उत्तर गलत है। संकलन से पहले '(int?)' को कास्टिंग लिंक 2 एसक्यूएल के संदर्भ में समझ में आता है, जहां 'Sum'' शून्य '(सीधे SQL क्वेरी से) वापस लौटा सकता है, भले ही संकलक गैर-निष्पादन परिणाम का उल्लंघन करता हो जो अपवाद का कारण बनता है। Linq2Objects के साथ, 'Sum' हमेशा '0' देता है भले ही सभी इनपुट तत्व' शून्य 'हों या कोई इनपुट तत्व न हो। – GSerg

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