2012-11-08 16 views
7

Bu hata ile karşılaşıyorum. Bunun sebebi, veri dönüş noktasından doğru olan zamanın geri döndüğü zamanın ortalamasıdır. Bu SQL sorgusu iyi çalışır, ancak bunun nedeni otomatik olarak 0,00 koymasıdır.Dizisi hiçbir öğe içermiyor - LINQ, MVC, Ortalama

LINQ şikayet ediyor ve DefaultIfEmpty() kullanmayı denedim ancak ViewModel'i beklediğini söylüyor.

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) 

GÜNCELLEME! Bunu yapmak için VB'ye gereksinim duyduğum şeyi yapan SQL sorgusudur.

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) 

cevap

7

sorun giriş IEnumerable(Of T) herhangi unsurları yoksa skaler LINQ yöntemlerinin hepsi (Ortalama, Max, vb ...) bir istisna olduğudur. g.Where çağrıları, istisna ile sonuçlanan boş bir koleksiyonla sonuçlanıyor gibi görünüyor.

Yapmak isteyebileceğiniz şey, boş durumu ele alan ve bir varsayılan değer döndüren bir yöntem yazmaktır.

+0

? Satır içi koşullu mu? Ben açıkça LINQ lol hakkında çok az şey biliyorum. – Chuck

+2

@Chuck neden varsayılan hata kullanmıyorsunuz? Bu tür şeyler için kastedilen – nawfal

+0

Nerede olacağından tam olarak emin değildim. Eğer gWhere (Function (t) t.PriorityId = 4) .DefaultIfEmpty() gibi bir yan tümcesini ViewModelType'ıma dönüştüremediğimde hemen koyarsam. – Chuck