2

我的 LINQ 中有一个方法 基本上我的 LINQ 查询所做的是它从我的数据库中检索数据。

用户可以在两个日期之间进行选择并检索这两个日期之间的数据。但是,如果用户选择没有数据的日期范围,我会收到此错误:

转换为值类型“Double”失败,因为具体化值为 null。结果类型的泛型参数或查询必须使用可为空的类型

即使没有数据,用户也应该可以在两个日期之间进行搜索,它应该给出一条错误消息,指出这些日期之间没有数据,而不是我在 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和可空的

非常感谢任何形式的帮助!

提前致谢!

4

3 回答 3

1

查看查询的最后一部分 - 如果在使用where子句过滤后没有返回任何行,那么s.GoalCardQuestionAnswer.Grade.Value肯定会抛出,因为您正在尝试访问为空的对象的属性。

我想如果你把代码改成这个,你会得到 0 作为最终值——那么你需要在你的代码中明确检查这个值。

.Average(s => s != null ? s.GoalCardQuestionAnswer.Grade.Value : 0)

否则,分解查询将是一个好主意——它有助于代码的调试和可读性。

于 2012-05-14T18:38:23.913 回答
0

我会拆分查询并进一步调查。我的猜测是有一些不一致的数据。可能它发生在您将 adouble与 a进行比较double?并且double?值为 null 的地方。也许检查你的记录是否有空值,实际上应该在那里。

于 2012-05-14T10:27:50.853 回答
0

当您尝试将聚合运算符应用于没有记录的结果集时,通常会出现该错误。看看你在哪里使用 .Average ,我相信你有一个查询之前没有返回任何记录。

于 2012-05-14T11:16:55.060 回答