2014-07-05 21 views
2

下面是我用於實體框架的類層次結構的簡化版本。實體框架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; } 
} 

因此,調查問卷有一個問題集合,每個問題可以有自己的兒童問題集合。

我面臨的問題是,當我從數據庫中檢索問卷時,它所包含的問題集合包括與該問卷相關的所有問題,包括嵌套在其他問題中的問題。

問題本身正確地包含對其子問題的引用。

目前我正在通過從Questionnaire.Questions集合中刪除所有Questions來解決此問題,其中ParentQuestionId != null

有沒有辦法告訴實體框架只包含在Questionnaire.QuestionsQuestions其中有一個空ParentQuestionId

回答

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

我沒有任何測試環境,所以我只能給你一些建議。

+0

或應該是!= null? –

+0

@philsoady「其中有一個null ParentQuestionId說」OP – Oliboy50

+0

是的,再次閱讀後 –