3
class User {
    public int Id {set;get;}
    public int ExternalId {set;get;}
}

このクラスを定義しました。コードファーストEFを使用しています。

public class FooContext : DbContext {
    public DbSet<User> Users { set; get; }
}

したがって、次のことを行うと:

db.Users.ToList().where(x=>x.ExternalId == externalId);

これが次のことを行うかどうか、私は興味があります:

select whatever from Users where ExternalId = 'id I passed in';

または、すべてのユーザーをメモリにロードして、Linq をメモリ内で実行しますか?

条件 (where 句) を使用してテーブルをクエリするベスト プラクティスは何ですか?

4

1 に答える 1

10

ToList()呼び出しにより、EFはすべてのユーザーレコードをDBからプルバックします。Where拡張メソッドの呼び出しは、メモリ内のセットに対して実行されます。呼び出しの順序を変更すると、次のように、データベースから必要なレコードのみが選択されます。

db.Users.Where(x=>x.ExternalId == externalId).ToList();

これは、EntityFrameworkが遅延実行を使用するためです。データベースへの呼び出しは、実際のレコードが呼び出し元のコードに列挙されるまで発生しません。結果を使用するまで、クエリは実行されるのを待っている単なる式ツリーです。Where()メソッドを見ると、その戻り型はIQueryableです。ToList()を呼び出すと、基本的に式ツリー(IQueryable)からユーザーの一般的なリストに変換されます。これには、EFがdbクエリを実行して結果を返す必要があります。

于 2012-07-13T03:26:11.783 に答える