我实际上是在尝试在查询中执行此操作(假表名,但我已将其缩小到与我正在使用的架构完全相同的内容:
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 存在一些问题。