簡體   English   中英

當加入空值時,為什么此嵌套式平均值不起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM