1

このクエリを変換しようとしています

select top(10) *
from SOMETABLE
where Name = 'test'

linq に入るので、このように見えるはずです

  var c =
  (from l
  in db.SOMETABLE
  where l.Name= 'test'
  select l).take(10);

しかし、サーバー プロファイラを調べると、linq がテーブルからすべてのデータを取得し、データベースからデータをプーリングした後に WHERE と TAKE を適用することがわかります。

問題は、SOMETABLE に ~10 000 000 のレコードがあり、高速に動作しないことです。

私はそれを間違っていますか?

4

1 に答える 1

7

あなたが投稿したコードには少なくとも 3 つの間違いがあるため、実際のコードではないと思います。あなたが説明した症状を得るには、最も可能性の高い原因は、IEnumerable<T>どこかで使用し、そこから作成していることです。エンド ツー エンドのクエリ構成を取得するには (つまりTOP、データベースで を実行するには)、 を使用する必要がありますIQueryable<T>。たとえば、以下は壊れています。

IEnumerable<SomeType> data = db.SomeTable;

var c = (from l in data
         where l.Name == "test"
         select l).Take(10);

ただし、最初の行のみが変更されていることに注意してください。

IQueryable<SomeType> data = db.SomeTable;

var c = (from l in data
         where l.Name == "test"
         select l).Take(10);

これも次と同じであることに注意してください。

IQueryable<SomeType> data = db.SomeTable;

var c = data.Where(l => l.Name == "test").Take(10);

IEnumerable<T>したがって、時期尚早に(またはリストなどの同様のものを)強制していないことを確認してください。

最後に、スキップ/テイクを適用している場合、IIRC Entity Framework は順序付けを要求します (適用しない場合はエラーになります) IEnumerable<T>。具体的にorder byも。

于 2012-04-25T08:53:54.720 に答える