c# - Entity Framework 6 - 处理嵌套对象的加载

标签 c# entity-framework-6

这是我在 Entity Framework 中使用的类层次结构的简化版本。

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; }
}

因此,调查问卷有一系列问题,每个问题都可以有自己的子问题集合。

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

问题本身正确地包含对其子问题的引用。

目前,我正在解决这个问题,方法是从 Questionnaire.Questions 集合中删除所有 Questions,其中 ParentQuestionId != null

是否有办法告诉 Entity Framework 仅在 Questionnaire.Questions 中包含具有 null ParentQuestionIdQuestions

最佳答案

在你的 Controller 中:

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

假设 db 是您的 QuestionnaireDBContext...

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

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

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

关于c# - Entity Framework 6 - 处理嵌套对象的加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24588568/

相关文章:

c# - 如何将解码后的 json 文件中的 bool 值转换为小写字符串?

c# - 如何创建 C# windows 应用程序以将文本文件拖放到 winword?

c# - 如何实现语法高亮方案?

c# - ObjectContext.GetObjectType(e.GetType()) 不返回 POCO 实体的实体类型

c# - 自动映射器错误映射集合类型

c# - 无法使用 LINQ OrderBy 中的属性名称进行排序

c# - 流畅的接口(interface)实现

c# - 加载后简单删除时出现 dbUpdateConcurrencyException

c# - 对象引用未设置到对象模型 fk 和虚拟字段的实例

entity-framework-6 - Entity Framework 6.1 - 对数据库的更改已成功提交,但在更新对象上下文时发生错误