2011-03-01 10 views
10

मुझे पता है कि यह क्यों हो रहा है लेकिन क्या कोई मुझे वाक्यविन्यास की सही दिशा में इंगित कर सकता है?LINQ.SUM() और nullable डीबी मान

वर्तमान में मेरे पास है:

var expense = from e in db.I_ITEM 
       where e.ExpenseId == expenseId 
       select e; 

return expense.Sum(x => x.Mileage ?? 0); 

मेरे समस्या यह है कि x.Mileage प्रकार की है कि "डबल?" और डीबी में शून्य मान है।

त्रुटि मैं मिलता है:

Exception Details: System.InvalidOperationException: The cast to value type 'Double' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type. 

क्या सही सिंटैक्स होगा?

उत्तर

18

मुझे आश्चर्य है कि विफल रहता हूँ, लेकिन एक विकल्प जो पराक्रम काम बस है नल मूल्यों और योग करने के लिए तो अशक्त कोलेसिंग ऑपरेटर का उपयोग करें: वस्तुओं इस होगा करने के लिए

return expense.Sum(x => x.Mileage) ?? 0d; 
निश्चित रूप से LINQ में

सही चीज करें, शून्य मानों को अनदेखा करें और अनुक्रम में कोई गैर-शून्य मान न होने पर आपको शून्य परिणाम (शून्य कोलेसिंग ऑपरेटर से पहले) दें।

+0

यह वास्तव में एक है जो कुछ भी करने के लिए Linq में बग नहीं है? टाइप सुरक्षा टूट गई है। – sinelaw

+0

@sinelaw: ऐसा लगता है, हाँ। यद्यपि अधिक जानकारी के बिना कहना मुश्किल है। –

0

कौन सा ओ/आर मैपर आप उपयोग कर रहे हैं, और आप किस डीबी का उपयोग कर रहे हैं? (लिंक से एसक्यूएल/इकाई फ्रेमवर्क/एसक्यूएल सर्वर)?

के बाद से अभिव्यक्ति किसी SQL बयान के रूप में डीबी में निष्पादित किया जाता है, मैं इसे कोलेसिंग ऑपरेटर के बिना काम करेगा लगता होगा: db.I_ITEM जहां e.ExpenseId == expenseId में

वर खर्च = ई से ई का चयन करें;

वापसी व्यय .um (x => x.Mileage);

0
var expense = (from e in db.I_ITEM 
       where e.ExpenseId == expenseId 
       select e.Mileage??0D); 
return expense.Sum(); 
4

के बारे में क्या

var expense = 
      from e in db.I_ITEM 
      where (e.ExpenseId == expenseId) && (e.Mileage.HasValue) 
      select e; 

return expense.Sum(x => x.Mileage); 
1

आप एक राय दे सकते हैं, Nulls छोड़कर यानी ...

decimal depts = 0; 

    var query = from p in dc.Payments 
       where p.UserID == UserID 
       select p.Amount; 

    if (query.Count() > 0) 
    { 
     depts = query.Sum(); 
    } 

    return depts; 
+0

'if (query.Count()> 0) 'आवश्यक है? –

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