我的LINQ中有一个方法 基本上我的LINQ查询的作用是它从我的数据库中检索数据。
用户可以在两个日期之间进行选择,并在这两个日期之间检索数据。但是,如果用户在没有数据的日期范围内选择,我会收到此错误:
转换为值类型'Double'失败,因为具体化值 一片空白。结果类型的泛型参数或查询必须 使用可空类型
即使没有数据,用户也应该在两个日期之间进行搜索,它应该给出一个错误消息,即这些日期之间没有数据,而不是我在Visual Studio中收到的这个错误。 我首先使用MVC实体框架模型。
以下是方法:
public List<CoreValueAndAverageGrade> GetAverageGradeForAllCoreValues(
OfficeStatisticQueryViewModel model)
{
var StartDate = DateTime.Parse(model.StartDate);
var EndDate = DateTime.Parse(model.EndDate);
return db.CoreValue
.Where(v => v.CoreValueQuestion
.Any(q => !q.SubjectType.Ignored_Statistic))
.Select(coreValue => new CoreValueAndAverageGrade
{
CoreValue = coreValue,
AverageGrade = coreValue.CoreValueQuestion
.Where(q => !q.SubjectType.Ignored_Statistic)
.Average(q => q.SelectedQuestions
.Where(s =>
s.GoalCardQuestionAnswer != null
&& s.GoalCardQuestionAnswer.Grade.HasValue
&& s.GoalCard.Completed_Date >= StartDate
&& s.GoalCard.Completed_Date <= EndDate
)
.Average(s => s.GoalCardQuestionAnswer.Grade.Value))
})
.ToList();
}
更新:成绩为Double
且可以为Nullable
非常感谢任何形式的帮助!
提前致谢!
答案 0 :(得分:1)
查看查询的最后一部分 - 如果在使用where
子句进行过滤后没有返回任何行,那么s.GoalCardQuestionAnswer.Grade.Value
肯定会抛出,因为您正在尝试访问对象的属性是空的。
我想如果你将代码更改为最终值,那么你需要在代码中明确检查这个值。
.Average(s => s != null ? s.GoalCardQuestionAnswer.Grade.Value : 0)
否则,打破查询将是一个好主意 - 它有助于代码的调试和可读性。
答案 1 :(得分:0)
我会分开查询并进一步调查。我的猜测是有一些不一致的数据。可能它发生在您将double
与double?
进行比较并且double?
值为空的某个位置。也许检查你的记录是否存在空值,实际应该存在。
答案 2 :(得分:0)
当您尝试将聚合运算符应用于没有记录的结果集时,通常会出现该错误。看看你在哪里使用。平均而且我确信你的查询之前没有返回任何记录。