实体框架6 - 处理嵌套对象的加载

时间:2014-07-05 16:47:09

标签: c# entity-framework-6

以下是我与实体框架一起使用的类层次结构的简化版本。

public class Questionnaire
{
   public int Id { get; set; }
   public ICollection<Question> Questions { get; set; }
}

public class Question
{
   public int Id { get; set; }
   public ICollection<Question> ChildQuestions { get; set; }

   // Navigation properties
   public int QuestionnaireId { get; set; }
   public virtual Questionnaire Questionnaire { get; set; }
   public int? ParentQuestionId { get; set; }
   public virtual Question ParentQuestion { get; set; }
}

因此,调查问卷有一系列问题,每个问题都有自己的儿童问题集。

我面临的问题是,当我从数据库中检索问卷时,其所持问题的集合包括与该问卷相关的所有问题,包括嵌套在其他问题中的问题。

问题本身正确包含了对孩子问题的引用。

目前,我正在通过从Questions Questionnaire.Questions集合ParentQuestionId != null删除所有Questionnaire.Questions来解决此问题。

有没有办法告诉实体框架只包含Questions ParentQuestionId的空{{1}}?

1 个答案:

答案 0 :(得分:3)

在您的控制器中:

Questionnaire questionnaire = 
    db.QuestionnaireDBSet
      .Include(x => x.Questions.Where(q => q.ParentQuestionId == null))
      .FirstOrDefault(x => x.Id == id);

假设db是您的QuestionnaireDBContext ...

编辑:正如OP所说,似乎我们无法使用Include进行过滤。所以上面的答案只适用于一个完美的世界。但现在你应该尝试这样的事情:

Questionnaire questionnaire = 
    db.QuestionnaireDBSet
      .Include(x => x.Questions)
      .Where(x => x.Questions.Any(q => q.ParentQuestionId == null))
      .FirstOrDefault(x => x.Id == id);

我没有任何测试环境,所以我只能给你一些建议。