1

我实际上是在尝试在查询中执行此操作(假表名,但我已将其缩小到与我正在使用的架构完全相同的内容:

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 可以为空。我现在希望得到这样的结果:

| 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 存在一些问题。

4

1 回答 1

1

.Where将语句更改为:

Where(av => av.ModelId == v.ModelId 
       || (!av.ModelId.HasValue && !v.ModelId.HasValue))

得到没有记录的平均值ModelId

于 2013-07-02T11:33:43.503 回答