如何在控制器查询中包含集合的外键属性?

时间:2012-10-24 18:06:13

标签: c# asp.net-mvc entity-framework

这可能是“走得太深”的情况,但无论如何我想我会问。我有以下型号:

public class Exam
{
    public int ID {get; set;}
    //...other Exam properties
    public virtual ICollection<ExamResults> Results {get; set;}
}

public class ExamResults
{
    public int ExamId {get; set;}
    //...other Exam Result properties
    public int ExamDomainId {get; set;}
    public virtual ExamDomain ExamDomain {get; set;}
}

public class ExamDomain
{
    public int ID {get; set;}
    public String DomainName {get; set;}
    //...more stuff
}

所以用简单的英语,考试有一系列的ExamResults。每个ExamResult都有一个ExamDomain,每个ExamDomain都有一个名称。

问题是:我的视图每次使用

时都会创建一个新的数据库查询
@Html.DisplayFor(e => e.exampleResult.ExamDomain.DomainName)

我无法在初始控制器查询中包含ExamDomain,因为Exam没有带Exam的导航属性。例如:

//The below does not work because ExamResults is a collection, not a record
var exam = db.Exams.Include(e => e.ExamResults.ExamDomain)...

//The code below also does not work, but it does run
var exam = db.Exams.Include(e =

话虽如此,如何从ExamDomain表中获取所有必需的DomainNames而不为每个ExamResult运行额外的查询?

PS:我确实有一个视图模型,但这个问题的目的并不重要。

1 个答案:

答案 0 :(得分:0)

这里有两个选项可以包含隐藏在集合下方的专业资料。

首先,字符串.Include语法才能正常工作:

   db.Exams.Include("ExamResults.ExamDomain")

或我个人喜欢使用lambda:

   db.Exams.Include(e => e.ExamResults.Select(r=>r.ExamDomain))

Checkout RoMillers(来自EF)发布关于如何使用lambda的帖子。他还在这篇文章中讨论了基于收集的内容http://romiller.com/2010/07/14/ef-ctp4-tips-tricks-include-with-lambda/