0

3 つの DB テーブルに基づく 3 つのエンティティがあります (関係の下のカーディナリティ)。

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 ミリ秒、インクルードありで 250 ミリ秒でした。これを最適化できるかどうか疑問に思っていますか?

4

1 に答える 1

1

インクルードなしで目的の数のプルをロードすることは、クエリが正しく行われた場合、セグメンテーションやソートを行わずに 1 つのテーブルを選択するだけでした。もちろん、それはより高速です。

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

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

もう 1 つの最適化は、SchoolClass と ClassType の関係が 1 対 1 (仕様によると) であるため、結合を 1 つ節約することです。

于 2011-10-20T12:26:58.227 に答える