2011-10-20 13 views
0

3つのエンティティが3つのDBテーブルに基づいています(リレーションシップの下のカーディナリティ)。Entity Framework - ナビゲーションパス内のオブジェクトをスキップする

Pupil - SchoolClass - ClassType 
    N:1   1:1 

私は生徒のリストを取得し、そのスカラプロパティGradeを更新したいです。 グレードは、生徒が受講するクラスの種類によって異なります。だから私はまた、各瞳孔のClassTypeが必要です。

これは私が何をすべきかです:

var pupils = from pupil in db.Pupils.Include("SchoolClass.ClassType") 
      select pupil; 

foreach(Pupil p in pupils) 
    p.Grade *= p.SchoolClass.ClassType.GradingFactor; 

これに伴う問題はSchoolClassが(+外部キーのID)で満たされたすべてのスカラプロパティで、コンテキストにロードされていることです。

瞳孔とClassTypeエンティティの間でオブジェクトをスキップする方法はありますか?つまり、SchoolClassのClassTypeナビゲーションプロパティのみをロードすることですか?

インクルードなしの瞳孔の必要な数をロードするのは20 msで、インクルードすると250 msでした。これを最適化できるかどうか疑問に思っていますか?

答えて

1

インクルードなしで所望の数のpuplesをロードすると、クエリが正しく取得された場合、セグメンテーションまたはソートなしで1つのテーブルで選択されただけです。もちろん、それはより速いです。

すべてのナビゲーションプロパティを読み込みました。それはいくつかの仕事です。あなたは瞳孔とそのGradingFactorだけを選択することを考えましたか?あなたはpupil.SchoolClass.ClassType.GradingFactorを意味した

+0

に参加するには1保存(あなたの仕様に応じて)1:

var pupils = from pupil in db.Pupils select new { Pupil = pupil, GradingFactor = pupil.SchoolClass.ClassType.GradingFactor }; 

別optimalisationが彼らの関係が1であるので、一緒にSchoolClassとするClassTypeをマージするだろうか? –

+0

申し訳ありません、はい、私のコードを修正しました – Polity

関連する問題