在我的存储库中使用LINQ获取null错误的方法

时间:2012-05-14 10:13:17

标签: c# asp.net-mvc asp.net-mvc-3 linq entity-framework

我的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

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

提前致谢!

3 个答案:

答案 0 :(得分:1)

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

我想如果你将代码更改为最终值,那么你需要在代码中明确检查这个值。

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

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

答案 1 :(得分:0)

我会分开查询并进一步调查。我的猜测是有一些不一致的数据。可能它发生在您将doubledouble?进行比较并且double?值为空的某个位置。也许检查你的记录是否存在空值,实际应该存在。

答案 2 :(得分:0)

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