2016-02-22 15 views
10

Entity Frameworkクエリの作成時にAsNoTrackingメソッドが呼び出される場所は重要ですか?例えばEntity FrameworkのAsNoTrackingがどこで呼び出されるかは重要です

私は文の最後になく、ToListメソッドは、このように呼ばれる前にそれを追加したいと
var matchingCustomers = context.Customers.AsNoTracking().Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).ToList(); 
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").AsNoTracking().Skip(50).Take(100).OrderBy(n => n.Name).ToList(); 
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).AsNoTracking().Take(100).OrderBy(n => n.Name).ToList(); 
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).AsNoTracking().OrderBy(n => n.Name).ToList(); 
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).AsNoTracking().ToList(); 
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).ToList().AsNoTracking(); 

var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).AsNoTracking().ToList(); 

答えて

10

んが、それは問題ではありませんしません:(source)

で新しいクエリNoTrackingが適用されていない場合はソースクエリが適用されます。

だから、初めにそれを行うのいずれか、あなたはメソッドチェーンで「新しい」クエリを展開する、またはあなたが最後にそれを行うとし、「新しい」クエリを取得します。クエリが実行される前にと呼んでいる限り、は正常です。

+1

実際、最後のケースでは、 'ToList'の後に' AsNoTracking'を呼び出すのはおそらくスローされます。そうでなければ、実際には 'AsNoTracking'が呼び出されるまでにエンティティが既にメモリに入っているので、実際にはノーオペレーションになります –

+2

@PanagiotisKanavosはい、「クエリが実行される前に」と言われています。 'クエリを実行します。 –

5

あなたはEFは、クエリを実行し、そしてtrakedいったんメモリにすでにデータ構造にNoTrackingを適用しようとしているので、私は

var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).ToList().AsNoTracking(); 

事項だと思います。

この流暢なAPIを使用すると、もちろん、クエリを実行するまでは実行せずにクエリを定義しています。 ToList()はクエリを実行し、データをメモリに持ち込んでデータ構造List<T>に変換します。

のは、この理解するためにコマンドを分割してみましょう:

  • context.Customersを - >は、お客様からの[*]を選択し
  • ここで(N => n.city == "ミラノ") - > [*]を選択してください。 == 'Milan'
  • city == 'Milan'のお客様から[*]を選択してください。 オフセット50行FETCH NEXT 100 ROWS only
  • オーダービューム - > [*]をcity == 'Milan'のお客様から選択してください OFFSET 50 ROWS FETCH NEXT 100 ROWS ONLY ORDER BY名前
  • ToList() - >デフォルトでトラッキングを使用してクエリを実行し、データをメモリに保存します。
  • AsNoTraking() - > EFが既にクエリ を実行し、データを追跡したため何もしません。
関連する問題