C# 方法,该方法在我的存储库中使用LINQ,从而获取空错误
我的LINQ中有一个方法 LINQ查询的基本功能是从数据库检索数据 用户可以在两个日期之间选择并检索这两个日期之间的数据。但如果用户选择的日期范围中没有数据,则我收到此错误: 转换为值类型“Double”失败,因为具体化的值 是空的。结果类型的泛型参数或查询必须 使用可为空的类型 即使没有数据,用户也可以在这两个日期之间搜索,它应该给出一条错误消息,说明这些日期之间没有数据,而不是我在VisualStudio中收到的这个错误。 我首先使用的是MVC实体框架模型 方法如下:C# 方法,该方法在我的存储库中使用LINQ,从而获取空错误,c#,asp.net-mvc,asp.net-mvc-3,linq,entity-framework,C#,Asp.net Mvc,Asp.net Mvc 3,Linq,Entity Framework,我的LINQ中有一个方法 LINQ查询的基本功能是从数据库检索数据 用户可以在两个日期之间选择并检索这两个日期之间的数据。但如果用户选择的日期范围中没有数据,则我收到此错误: 转换为值类型“Double”失败,因为具体化的值 是空的。结果类型的泛型参数或查询必须 使用可为空的类型 即使没有数据,用户也可以在这两个日期之间搜索,它应该给出一条错误消息,说明这些日期之间没有数据,而不是我在VisualStudio中收到的这个错误。 我首先使用的是MVC实体框架模型 方法如下: public List
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();
}
public List GetAverageGradeForAllCoreValues(
OfficeStatisticQueryView模型)
{
var StartDate=DateTime.Parse(model.StartDate);
var EndDate=DateTime.Parse(model.EndDate);
返回db.CoreValue
.其中(v=>v.CoreValueQuestion
.Any(q=>!q.SubjectType.Ignored_Statistic))
.选择(coreValue=>新coreValue和平均等级
{
CoreValue=CoreValue,
AverageGrade=coreValue.CoreValueQuestion
.Where(q=>!q.SubjectType.Ignored_统计)
.平均(q=>q.选择的问题
。其中(s=>
s、 GoalCardQuestionAnswer!=空
&&s.GoalCardQuestionAnswer.Grade.HasValue
&&s.GoalCard.Completed_Date>=开始日期
&&s.GoalCard.Completed_日期s.GoalCard问题答案.等级.值)
})
.ToList();
}
更新:等级为Double
且可为空
非常感谢您的任何帮助
提前谢谢 我会将查询拆分,并进一步调查。我的猜测是有一些不一致的数据。可能发生在将
double
与double?
进行比较时,double?
值为空。也许可以检查记录中是否存在空值,而空值实际上应该存在。当您试图对没有记录的结果集应用聚合运算符时,通常会出现此错误。查看您使用.Average的位置,我确信您的查询之前没有返回任何记录。查看查询的最后一部分-如果使用where
子句筛选后没有返回任何行,然后,s.GoalCardQuestionAnswer.Grade.Value
肯定会抛出,因为您试图访问空对象的属性
我假设,如果您将代码更改为该值,您将得到0作为最终值,那么您需要在代码中显式地检查该值
.Average(s => s != null ? s.GoalCardQuestionAnswer.Grade.Value : 0)
否则,分解查询将是一个好主意-它有助于调试代码和代码的可读性。异常消息确实说明了发生了什么,但您必须进一步调查,因为只有您知道有关模型的信息。我们不知道哪些字段是双字段或可空字段,但显然存在问题。@Steven我在LINQ中更新了这些信息,我说等级必须有值。但在某种程度上,如果没有值,我想抛出一条错误消息,比如“这两个日期之间没有数据”,而不是在我的方法中接收错误。如果它不返回任何内容,是否可能执行一些不会给出方法错误的操作?Beaucse如果它没有返回任何我想为用户显示的消息在这些日期之间是否有任何等级,然后,在这些日期之间没有goalcardanswer对象分割查询,逐步执行并调试它,我保证在您尝试平均处理的其中一个查询的结果中有0条记录。成绩上没有记录。因为这两个日期之间没有分数,所以我收到了这个错误。很抱歉误解。:)然后我将从查询“.Average(s=>s.GoalCardQuestionAnswer.Grade.Value)”中删除这一行,并将要设置的查询值移动到一个变量,而不是返回。然后检查该变量是否为null,Count()==0,因为如果没有记录,该变量将不会为null。然后,如果有记录,则应用最后一个.Average操作。如果没有,返回您想要的任何消息。