12

データベースに対してクエリを実行するために EF (dll バージョンは 4.4) を使用しています。データベースには、コース情報を含むいくつかのテーブルが含まれています。実際にデータベースに送信されたものを見ると、ほぼ 1300 行の大量の SQL クエリが表示されます (サイズが大きいため、ここには貼り付けません)。コンテキストで実行しているクエリは次のようになります。

entities.Plans
  .Include("program")
  .Include("program.offers")
  .Include("program.fees")
  .Include("program.intakes")
  .Include("program.requirements")
  .Include("program.codes")
  .Include("focuses")
  .Include("codes")
  .Include("exceptions")
  .Include("requirements")
where plans.Code == planCode
select plans).SingleOrDefault(); 

関連する各テーブルから情報を収集するときにサーバーに戻る必要がないようにしたいのですが、このような大きなクエリでは、これを行うためのより良い方法があるかどうか疑問に思っていますか?

ありがとう。

4

5 に答える 5

1

少し遅れましたが、データは 1 日に 1 回しか変更されないため、必要なものすべてをインデックス付きビューに入れ、このビューを EF モデルに配置することを検討してください。

于 2013-08-14T10:11:22.893 に答える
0

を使用している場合は、コンテキストでプロパティDbContextを使用して.Local、エンティティが既に取得されているかどうか、したがってコンテキストにアタッチされているかどうかを確認できます。

クエリが以前に実行されていて、ルートPlanエンティティが に基づいて既にアタッチされPlan.Code == planIdている場合、熱心な読み込みを行ったため、おそらくそのサブエンティティも既にアタッチされているため、ナビゲーション プロパティを介してそれらを参照しても、クエリ中にそれらの DB に再度ヒットすることはありません。そのコンテキストの存続期間。

この記事は、を使用する際に役立つ場合があります.Local

于 2013-06-02T22:14:26.797 に答える
0

.Include()通常、where 句の後に を追加できます。これは、必要なものに一致する情報のみを引き出していることを意味します。それによってクエリが削減されるかどうかを確認してください。

于 2013-04-22T03:28:16.397 に答える
0

参照エンティティを引き戻すのではなく、プロジェクションを使用することで、もう少し簡潔な SQL クエリを取得できる場合があります。Include

var planAggregate = 
 (from plan in entities.Plans
  let program = plan.Program
  let offers = program.Offers
  let fees = program.Fees
  //...
  where plan.Code == planCode
  select new {
    plan
    program,
    offers,
    fees,
    //...
  })
  .SingleOrDefault();

コンテキストで遅延読み込みを無効にすると、この種のクエリでは、エンティティのナビゲーション プロパティが、クエリに含まれていたエンティティに取り込まれます。

(私はこれを EF.dll v5.0 でのみテストしましたが、.NET 4.0 では EF5 である EF.dll v4.4 でも同じように動作するはずです。Include同様の形状ではなく、このパターンを使用してテストしたとき500 行の SQL のうち約 70 行を削減します。マイレージは異なる場合があります。)

于 2013-07-25T16:16:03.487 に答える