2012-11-08 17 views
7

मैं इस त्रुटि में भाग रहा हूं। मैं देखता हूं कि इसका कारण यह है कि समय पर औसत औसत 0.00 होता है जो डेटा स्टैंड पॉइंट से सटीक होता है। यह SQL क्वेरी ठीक काम करती है, लेकिन ऐसा इसलिए है क्योंकि यह स्वचालित रूप से 0.00 में डालता है।अनुक्रम में कोई तत्व नहीं है - LINQ, MVC, औसत

LINQ शिकायत करता है और इसलिए मैंने DefaultIfEmpty() का उपयोग करने का प्रयास किया लेकिन यह कहता है कि यह मेरे व्यूमोडेल की अपेक्षा कर रहा है।

Dim ticketCounts = From t In queue _ 
    Where _ 
    (t.StatusId = 2) And _ 
    (t.CloseDate.Year = Convert.ToDateTime(DateTime.Now).Year) And _ 
    (t.ResolutionDays > 0) 
    Group t By _ 
    Column1 = CType(t.CloseDate.Month, Integer), _ 
    Column2 = CType(t.CloseDate.ToString("MMMM"), String) _ 
    Into g = Group _ 
    Order By Column1 _ 
    Select _ 
    Id = Column1, _ 
    Month = Column2, _ 
    Critical = g.Where(Function(t) t.PriorityId = 1).DefaultIfEmpty().Average(Function(t) t.ResolutionDays), _ 
    High = g.Where(Function(t) t.PriorityId = 2).DefaultIfEmpty().Average(Function(t) t.ResolutionDays), _ 
    Normal = g.Where(Function(t) t.PriorityId = 3).DefaultIfEmpty().Average(Function(t) t.ResolutionDays), _ 
    Low = g.Where(Function(t) t.PriorityId = 4).DefaultIfEmpty().Average(Function(t) t.ResolutionDays), _ 
    Total = g.Where(Function(t) t.Id <> Nothing).DefaultIfEmpty().Average(Function(t) t.ResolutionDays) 

अपडेट किया गया! यह वही काम कर रहा है जो मुझे वीबी की आवश्यकता है।

SELECT 
    DATENAME(MONTH,t.CloseDate) AS 'Month', 
    AVG(CASE WHEN (t.PriorityId = 1) THEN CAST(t.ResolutionDays AS Decimal(18, 2)) ELSE 0 END) AS 'Critical', 
    AVG(CASE WHEN (t.PriorityId = 2) THEN CAST(t.ResolutionDays AS Decimal(18, 2)) ELSE 0 END) AS 'High', 
    AVG(CASE WHEN (t.PriorityId = 3) THEN CAST(t.ResolutionDays AS Decimal(18, 2)) ELSE 0 END) AS 'Normal', 
    AVG(CASE WHEN (t.PriorityId = 4) THEN CAST(t.ResolutionDays AS Decimal(18, 2)) ELSE 0 END) AS 'Low', 
    AVG(CAST(t.ResolutionDays AS Decimal(18, 2))) AS 'Monthly Average' 
FROM 
    tblMaintenanceTicket t 
WHERE 
    t.StatusId = 2 
    AND YEAR(t.CloseDate) = year(getdate()) 
GROUP BY 
    MONTH(t.CloseDate), 
    DATENAME(MONTH,t.CloseDate) 
ORDER BY 
    MONTH(t.CloseDate) 

उत्तर

7

समस्या यह है कि अदिश LINQ तरीकों के सभी (औसत, मैक्स, आदि ...) यदि इनपुट IEnumerable(Of T) किसी भी तत्व नहीं है एक अपवाद फेंक है। ऐसा लगता है कि g.Where कॉल के परिणामस्वरूप रिक्त संग्रह होता है जिसके परिणामस्वरूप अपवाद होता है।

आप जो करना चाहते हैं वह एक ऐसी विधि लिखना है जो खाली केस को संभालती है और एक डिफ़ॉल्ट मान देता है।

+0

मुझे लगता है कि सुझाव एक जोड़े को अलग अलग तरीकों की कोशिश की है, लेकिन बात के इस प्रकार पूरा इनलाइन हो सकता है? एक इनलाइन सशर्त की तरह? मैं LINQ लॉल के बारे में बहुत कम पता है। – Chuck

+2

@Chuck आप डिफ़ॉल्ट अक्षमता का उपयोग क्यों नहीं कर सकते? यह इस तरह की चीजों के लिए है – nawfal

+0

मुझे यह सुनिश्चित नहीं था कि इसे कहां रखा जाए। अगर मैं इसे कहां से दाहिनी तरफ रखता हूं। जहां (फंक्शन (टी) टी। प्राथमिकता आईडी = 4)। डीफॉल्ट IfEmpty() कि यह मेरे ViewModelType में परिवर्तित नहीं हो सकता है। – Chuck

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