8

に* SELECT実行されている:.SKIP()(テイク)Entity Frameworkのナビゲーションプロパティには、私はこのように私の生成された部分クラスのメソッドを持っている私のSQL Serverの

var pChildren = this.Children 
    .Skip(skipRelated) 
    .Take(takeRelated) 
    .ToList(); 

私はSQL Serverのを見て、私は生成されたコードがSELECT *.* FROM Childrenをしているのがわかりますこのコードは私のクラスから直接取られ、私はSkip/Takeの順序が私の.ToListより前であることを確認しました。

私は.ToListを削除すると、その行は(そしてSQLが私のDBに送信されません)高速ですが、私は結果の上にforeachにしようとした瞬間は、私は私のDBに送信された同じSQLを取得:SELECT *.* FROM Childrenを。

.Skipを使用して、私のエンティティのナビゲーションプロパティのを使用する際に、何か特別なことがありますか?私は生成された実際のSQLを取得しようとするでしょう

更新

は、私は現在、そのためのセットアップではありませんよ。 SSMSの「最近の高価なクエリ」リストに表示されるため、最初のものが見つかりました。

var pChildren = this.Children 
    //.Skip(skipRelated) 
    //.Take(takeRelated) 
    .ToList(); 

〜4,000,000行戻り、〜25秒かかります。これを実行する

var pChildren = this.Children 
    //.Skip(skipRelated) 
    .Take(takeRelated) 
    .ToList(); 

〜4,000,000行戻り、〜25秒かかります。これを実行する

私が言ったように、私はこれらのために生成されたSQLをつかんで、それを同様にポーズします。

+0

このような
var pChildren = this.Children.CreateSourceQuery() .OrderBy(/* */).Skip(skipRelated).Take(takeRelated); 

を照会することができますか? – cdhowie

+0

私は 'SELECT TOP 10 FROM Children WHERE ParentID = @ idOfParentEntity'のようなものを望んでいました(EFが.Skipをどのように扱うのか忘れていますが、それは私が読んだものです。返されるデータを特定の "ページ"に限定する) – Nate

+0

'.Skip()'の存在は 'TOP'の使用を排除します。あなたが 'skipRelated'と' takeRelated'を合計し、それを 'TOP'へのパラメータとして使うことを期待していない限り...最適化であるかもしれませんが、それはパフォーマンスに影響を与えません。 – cdhowie

答えて

7

を参照してください問題は、あなたがそのような子コレクションを照会するときに、LINQツーオブジェクトのクエリを実行していることです。 EFはコレクション全体をロードし、メモリ内でクエリを実行します。

あなたはEF 4を使用している場合、あなたはこのコードを生成するために期待して何をしたかSQL EF 4.1

var pChildren = context.Entry(this) 
        .Collection(e => e.Children) 
        .Query() 
        .OrderBy(/* */).Skip(skipRelated).Take(takeRelated) 
        .Load(); 
+0

まさに私が必要としたもの。私はEF4.1を使用していますが、この特定のメソッドからコンテキストにアクセスすることができないため、最初のクエリがよりうまく機能します。 – Nate

1

Takeの結果にSkipを呼び出すと役立ちますか?すなわち、また

table.Take(takeCount+skipCount).Skip(skipCount).ToList() 

+5

スキップする前に取ると意味がありません – vittore

+1

@vittore:そうです。レコード51-100が必要な場合は、クライアントに100万を渡す代わりに、50を放棄し、50を保持し、残りを投げ捨てて、クライアントに100を渡して50を放棄することができます。 –

+0

@BenVoigtあなたが最後のページに行くほど助けてくれません。 – Nate

関連する問題