2012-10-22 20 views
6

hereを読んで、読取り操作のためにデータを照会するときに、ObjectTrackingEnabledからfalseに設定するとパフォーマンスがいくらか向上します。私のクエリは次のようになります。私は場合ObjectTrackingEnabledとlinq-to-sql

public return type TheQueryName (some parameters) 
{ 
    using (TheDC MyDC = new TheDC()) 
    { 
     var TheQuery = (...).ToList(); 

     return TheQuery; 
    } 
} 

1)私はパフォーマンス向上を追加したい場合は、私はちょうど、var TheQuery = (...).ToList();

2)また、単に行の前に行ObjectTrackingEnabled = true;を追加しますクエリでObjectTrackingEnabledtrueに設定すると、返される前にfalseに設定する必要がありますか?つまり、データコンテキストの特定のインスタンスに対してObjectTrackingEnabledを設定して、次の時刻に新しいデータコンテキストをインスタンス化します。ObjectTrackingEnabledの値は元に戻りますバックtデフォルトの状態はfalse

注:私は操作を読むためにObjectTrackingEnabled = false;を追加するだけです。

ありがとうございました。

+0

これはあなたが不必要なものを追跡している場合は、物事が制御不能CRAZYを得ることができる方法についての別の有用なブログ記事です:https://weblog.west-wind.com/posts/2014/dec/21/gotcha -entity-framework-gets-slow-in-long-iteration-loops –

答えて

8

ObjectTrackingEnabledは、データ・コンテキスト(ケース内のTheDC)がエンティティのロード後に変更を追跡するかどうかを制御します。あなたがそれを望むかどうかはあなたの特定の場合に依存します。

当然ながら、データコンテキストを使用すると、処理時間が短縮されますが、に負担がかかります。に変更があります。変更履歴が涼しいのはなぜですか?あなたがすることができるので:いくつかのコンテキスト

  • からいくつかの実体が
  • は、新しいものを追加します。他の人
  • コールSaveChangesを削除し、データコンテキストが変更されたエンティティのためにUPDATEクエリを行うには把握させ、それらを修正し

    1. ロードアップ、変更が無効に追跡して

    など、削除されたもののためにDELETE、あなたはなど、新しい値が何であるか、変更され、明示的にどのような状況を伝える必要があり

    オブジェクトトラッキングを使用しないと仮定すると、プロパティはそれぞれの特定のデータコンテキストインスタンスに設定されます。これは、あなたがどちらかに持っていることを意味:そのような状況のコンストラクタでのコンテキストのデフォルトとして、それを設定し、それは手動ですべてのデータコンテキストのためにあなたが

  • を作成

    1. セット:this.Configuration.AutoDetectChangesEnabled = true;詳細
    ためthis blog postを参照してください。

    これが役立つことを願っています!

  • +0

    明確にするために、読み込み操作ではObjectTrackingEnabledをfalseに設定します。シンタックスが続く限り、ポイント1の質問を見ることができますか? – frenchie

    +0

    変更追跡を無効にする場所については、コンテキストを作成するとすぐにやります。したがって、あなたの場合は、クエリの前に 'using'ステートメントの直後にあります。 –

    0

    あなたのタグと件名は 'Linq2SQL'ですが、あなたの質問はEntity Framworkに関するものです。

    '伝統的な' Linq2SQLについては

    あなたは、この代わりに、必要があります。

    参照する
    linq2SqlDBContext.ObjectTrackingEnabled = false; 
    
    +1

    Simon_Weaver、AFAIK" DataContext "はL2Sの正しい用語です。 EFは "ObjectContext"で始まり、次に追加されて "DbContext"に移動しました。また、L2SはObjectTrackingEnabledを提供します。例:https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/linq/how-to-retrieve-information-as-read-only – pakx

    +0

    これは私が同時に3つの異なるMS 'datacontext'世代: - / –

    1

    に:私はパフォーマンス向上を追加したい場合は

    1)、私はただの行を追加しますObjectTrackingEnabled = true; just before the line var TheQuery = (...).ToList();

    クエリのパフォーマンスの向上は、追跡中ではありません。 この目的のために新しいdatacontextが作成された直後に、READクエリでこの機能を無効にしたいとします。

    ObjectTrackingEnabled = FALSE