0

これは「深入りしすぎ」の場合かもしれませんが、とにかく聞いてみようと思いました。私は次のモデルを持っています:

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
}

したがって、平易な英語では、Exam には ExamResults のコレクションがあります。各 ExamResult には ExamDomain があり、各 ExamDomain には名前があります。

問題はこれです:私のビューは、使用するたびに新しいデータベースクエリを作成します

@Html.DisplayFor(e => e.exampleResult.ExamDomain.DomainName)

Exam には Exam のナビゲーション プロパティがないため、最初のコントローラー クエリに ExamDomain を含めることはできません。例:

//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 =

そうは言っても、すべての ExamResult に対して追加のクエリを実行せずに、ExamDomain テーブルから必要なすべての DomainNames を取得するにはどうすればよいでしょうか?

PS:ビューモデルはありますが、この質問の目的には関係ありません。

4

1 に答える 1

0

コレクションの下に隠されているプロパティを含めるには、2 つのオプションがあります。

まず、文字列 .Include 構文が機能するはずです。

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

またはラムダを使用した私の個人的な好み:

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

ラムダ インクルードの使用方法に関する RoMillers (EF の投稿) をチェックしてください。彼はまた、この投稿http://romiller.com/2010/07/14/ef-ctp4-tips-tricks-include-with-lambda/で、コレクション ベースのインクルードについても話します。

于 2012-10-24T19:00:40.007 に答える