2011-12-29 19 views
12

अगर मैं कार्य करें:खाली सेट शून्य का योग क्यों है?

int updateGamePlays = db.tblArcadeGames.Where(c => c.ParentGameID == GameID).Sum(c => c.Plays); 

कोई रिकॉर्ड इस क्वेरी फेंक देता में लौट रहे हैं, तो:

System.InvalidOperationException: शून्य मान के प्रकार System.Int32 साथ एक सदस्य नहीं सौंपा जा सकता है एक गैर-शून्य मूल्य प्रकार है।

एक ही तरीका है यह 0 है वापस जाने के लिए करने से प्राप्त करने के लिए:

int updateGamePlays = db.tblArcadeGames.Where(c => c.ParentGameID == GameID).Sum(c => (int?)c.Plays) ?? 0; 

डेटाबेस c.Plays में गैर-व्यर्थ पूर्णांक है।

सेट सिद्धांत में एक खाली सेट का योग 0 (ref) के बराबर होना चाहिए। लिंक-टू-एसक्यूएल में कैसे आता है, क्या उन्होंने इसे null वापस करने का निर्णय लिया?

+4

यह अधिक डेटाबेस और कम सेट सिद्धांत है। SQL सर्वर में एक शून्य कॉलम का 'SUM' क्या है? – Marc

+0

@ प्रश्न में मैं किसी भी कॉलम के लिंक से लिंक नहीं कर सकता हूं –

+1

क्या एल 2 एस डीबीएमएल जानता है कि इस डेटा सेट के लिए? मुझे लगता है कि यह क्षेत्र एक 'int' होगा और 'int' नहीं होगा। – Marc

उत्तर

9

According to a source at Microsoft, बीमा राशि() एक खाली सेट पर क्योंकि जिस तरह से यह एसक्यूएल में काम करता है की null है:

जब तालिका खाली मैं इस अपवाद हो रही है: InvalidOperationException

में एसक्यूएल, योग() कुल ऑपरेटर रिक्त सेट के लिए शून्य देता है। तो यह डिजाइन के रूप में है।

+16

"... गलत डिज़ाइन के रूप में। " – starblue

+1

लेकिन यदि आप रिक्त आईन्यूमेरेबल पर Sum का उपयोग करते हैं, तो यह सही ढंग से 0 देता है। इसलिए, माइक्रोसॉफ्ट ने आईक्यूएलएबल पर Sum() को एसक्यूएल के साथ संगत होने के लिए चुना है लेकिन IENumerable पर Sum() के साथ असंगत है। संदिग्ध विकल्प ... – JustAMartin

0

आप शून्य का एक बीज से संबंधित सामान्य Aggregate विधि का उपयोग कर सकते हैं:

int updateGamePlays = db.tblArcadeGames 
    .Where(c => c.ParentGameID == GameID) 
    .Aggregate(0, (a, c) => a + c.Plays); 

यह नल प्रकार का उपयोग की आवश्यकता नहीं है।

+0

मुझे LINQ से SQL के बारे में पता नहीं है, लेकिन LINQ से संस्थाएं 'कुल' का समर्थन नहीं करती हैं। –

2

एक और विकल्प यह सुनिश्चित करने के लिए सेट में 0 जोड़ना है कि कम से कम एक मान हमेशा होता है।

int updateGamePlays = db.tblArcadeGames.Where(c => c.ParentGameID == GameID) 
             .Select(c => c.Plays) 
             .Concat(new [] { 0 }) 
             .Sum(); 
संबंधित मुद्दे