2012-11-08 22 views
7

Tôi đang gặp phải lỗi này. Tôi thấy rằng lý do là bởi vì trung bình trở lại vào thời điểm là 0,00 mà từ một điểm dữ liệu là chính xác. Truy vấn SQL này hoạt động tốt, nhưng đó là bởi vì nó đặt trong 0,00 tự động.Trình tự không chứa các phần tử - LINQ, MVC, Trung bình

LINQ than phiền và vì vậy tôi đã thử sử dụng DefaultIfEmpty() nhưng nó cho biết nó đang chờ ViewModel của tôi.

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) 

CẬP NHẬT! Đây là truy vấn SQL làm điều tương tự tôi cần VB để làm.

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) 

Trả lời

7

Vấn đề là tất cả các phương pháp vô hướng LINQ (Average, Max, vv ...) ném một ngoại lệ nếu đầu vào IEnumerable(Of T) không có bất kỳ yếu tố. Có vẻ như các cuộc gọi g.Where dẫn đến một bộ sưu tập trống dẫn đến ngoại lệ.

Những gì bạn có thể muốn làm là viết một phương thức xử lý trường hợp trống và trả về giá trị mặc định.

+0

Tôi đã cố gắng đó gợi ý một vài cách khác nhau, nhưng kiểu này mà có thể được hoàn thành nội tuyến? Giống như một điều kiện nội tuyến? Tôi biết rất rõ về LINQ lol. – Chuck

+2

@Chúc tại sao bạn không thể sử dụng defaultifempty? Nó có nghĩa là cho loại công cụ – nawfal

+0

Tôi đã không exacly chắc chắn nơi để đặt nó. Nếu tôi đặt nó ngay sau mệnh đề where như g.Where (Function (t) t.PriorityId = 4) .DefaultIfEmpty() mà nó không thể chuyển đổi thành ViewModelType của tôi. – Chuck

Các vấn đề liên quan