实体命令执行异常

Entity Command Execution Exception

编译时出现实体命令执行异常。同一行代码在其他地方工作正常,但在适当的地方我需要它 returns 这个异常。

//Working fine here!
Questionnaire questionnaireeeee = context.Set<Questionnaire>().Include(q => q.QuestionnaireQuestions.Single(q => q.ID == 1);
//need to see who is logged in, administrator or professor
 string userId = User.Identity.GetUserId();
//...
if(User.IsInRole("Administrator"))
{
    //grouping subject instances by same semester
    var subjectInstancesBySemester = from subjectInstances in context.SubjectInstances group subjectInstances by subjectInstances.Semester;
    foreach (var subjectInstancesGroup in subjectInstancesBySemester)
    {
         // getting questionnaire related to this semester
         if(subjectInstancesGroup.Key.QuestionnaireID != null)
         {
        //Exception is here!
             Questionnaire questionnaire = context.Set<Questionnaire>().Include(q => q.QuestionnaireQuestions).Single(q => q.ID == (int) subjectInstancesGroup.Key.QuestionnaireID);
             //...
         }
    }
}

然后断点查看,subjectInstancesGroup.Key.QuestionnaireID值为1,table问卷中有一行ID为1,问题出在哪里?

Entity framework 可能无法编译你给他的表达式树。

添加 .ToArray() 是否解决了问题?

var subjectInstancesBySemester = 
       from subjectInstances in context.SubjectInstances 
       group subjectInstances by subjectInstances.Semester;

foreach (var subjectInstancesGroup in subjectInstancesBySemester.ToArray())
{
     // getting questionnaire related to this semester
     if(subjectInstancesGroup.Key.QuestionnaireID != null)
     {
         var questionnaireId = (int) subjectInstancesGroup.Key.QuestionnaireID;
         Questionnaire questionnaire = context.Set<Questionnaire>().Include(q => 
                  q.QuestionnaireQuestions).Single(q => q.ID == questionnaireId);
         //...
     }
}

通过添加 .ToArray() 可以对数据库执行查询。 Entity framework 现在不需要在更复杂的查询中编译它。当您以任何方式迭代整个返回集时,我认为这不会成为问题。