[英]Why won't this nested Average work when joining on null value?
我本質上是想在查詢中執行此操作(假表名稱,但是我已使用我使用的模式將其范圍縮小到完全像這樣:
from v in db.Vehicles
let avgVehicleModelMilesDriven = db.Vehicles.Where(av => av.ModelId == v.ModelId)
.Average(av => av.MilesDriven)
select new
{
v.Id,
v.ModelId,
v.MilesDriven,
avgVehicleModelMilesDriven
}
我期望的結果是:
| Id | ModelId | MilesDriven | AverageModelMilesDriven |
1 1 10,000 15,000
2 1 20,000 15,000
3 2 15,000 15,000
上面的方法工作正常,但讓我介紹一個破壞事物的架構更改。 假設ModelId可以為null。 我現在期望這樣的結果:
| Id | ModelId | MilesDriven | AverageModelMilesDriven |
1 1 10,000 15,000
2 1 20,000 15,000
3 2 15,000 15,000
4 null 5,000 5,000
取而代之的是,我得到以下異常: The null value cannot be assigned to a member with type System.Double which is a non-nullable value type.
。 這向我表明,我要平均的集合沒有任何值。 我可以使它起作用的唯一方法是將所選的平均值轉換為可空的int
如下所示:
db.Vehicles.Where(av => av.ModelId == v.ModelId)
.Average(av => (int?)av.MilesDriven)
我最終得到不正確的結果,例如:
| Id | ModelId | MilesDriven | AverageModelMilesDriven |
1 1 10,000 15,000
2 1 20,000 15,000
3 2 15,000 15,000
4 null 5,000 null
我不知道這是怎么回事,因為至少存在一種該類型的車輛,否則它將不會嘗試獲取該類型的平均值。 我也嘗試通過聯接來表達這一點,但是得到了相同的結果。 我是否缺少明顯的東西? 我可以在兩個查詢中執行此操作,但是在這種情況下,我需要將結果保留為IQueryable。 預先感謝您提供的任何幫助!
編輯 -創建一個小型測試程序,該程序執行相同的操作,但正在處理這些對象的本地集合,而不是進入數據庫。 它按預期工作。 我猜它嘗試生成的SQL出現問題。
將.Where
語句更改為:
Where(av => av.ModelId == v.ModelId
|| (!av.ModelId.HasValue && !v.ModelId.HasValue))
獲取沒有ModelId
的記錄的平均值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.