2012-11-08 25 views
7

このエラーが発生しています。その理由は、時々返される平均が0.00であるため、データの立場から正確であることがわかります。このSQLクエリはうまく動作しますが、それは自動的に0.00になるためです。シーケンスに要素がありません - LINQ、MVC、平均

私はDefaultIfEmpty()を使ってみましたが、私のViewModelを期待しています。

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) 

UPDATED! これはVBに必要なものと同じことをするSQLクエリです。

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

問題は、入力IEnumerable(Of T)はどんな要素を持っていない場合、スカラーLINQ法のすべて(平均、最大値、などが...)例外をスローということです。 g.Where呼び出しによって空のコレクションが生成され、例外が発生したようです。

空の場合を処理し、デフォルト値を返すメソッドを作成することができます。

+0

私はその提案にカップルのさまざまな方法を試してみましたが、事のこのタイプは、完全にインラインすることができますか?インライン条件式のように?私は明らかにLINQ LOLについてはほとんど知りません。 – Chuck

+2

@Chuckなぜdefaultifemptyを使用できないのですか?それはこの種のもののために意味されています – nawfal

+0

私はそれを置くために確かにどこに確信していませんでした。私はそれを私のViewModelTypeに変換することはできませんg.Where(関数(t)のt.PriorityId = 4).DefaultIfEmpty()のようなwhere節の直後に置く場合。 – Chuck

関連する問題