4

EF6フレームワークを使用する場合、1つのDbContextクラスと複数のパフォーマンスの影響を理解しようとしています。私たちはこのような簡単なDbContextを持っている場合DbContextでクエリが実行されるタイミング

たとえば、:

public class CarService 
{ 
    public List<Car> Cars { get; private set; } 
    public CarService() 
    { 
     var dbContext = new MainDbContext(); 
     Cars = dbContext.Cars.ToList(); 
    } 
} 

時:

public class MainDbContext : DbContext 
{ 
    public DbSet<Car> Cars { get; set; } 

    public void AddCar(Car car) 
    { 
     Cars.Add(car); 
     SaveChanges(); 
    } 
} 

を今、私たちは、私は次のように述べDbContextを使用するサービスを持っているとしましょうどの時点でDbContextはデータベースにアクセスし、データベースに格納されているすべての車を取得しましたか?私がvar dbContext = new MainDbContext();と呼んだとき、それともCars = dbContext.Cars.ToList();と呼んだときでしたか?

前者の場合、100個のテーブルを含むDbContextがある場合、DbContextの作成時に100個のテーブルすべてがクエリされますか?

+2

「DbContextはいつの時点でデータベースに格納され、データベースに格納されているすべての車を取得しましたか?」そのコードでは、決して。 DBContextの 'Cars'プロパティは' DbSet ' – Gusman

+1

の型でなければなりません。' DbSet 'であっても、明示的にそのようなものを呼び出すことによってデータベースからデータをフェッチします'ToList()' 'Cars'自体は何もしません。エンティティのコンテナですが、そうしなければすべてのデータを保持しているわけではありません。 Linqで 'IQueryable'を使用すると、データは列挙子を評価するときや、コンテキストを介して基礎となる接続に対してSQL文を実行するときにのみ取得されます。 – xxbbcc

答えて

6

いいえ。テーブルを列挙するとクエリが実行されます。 2番目の例でも、それはまだデータベースに接続しません。

あなたが列挙するときには、たとえば、接続します:

dbContext.Cars.ToList(); 

それとも

foreach (Car c in dbContext.Cars) 

またはUIコントロールにテーブルをバインドします。

ただし、あなたがどこで行ったか、注文してから、次に、参加するなど。

var result = dbContext.Cars.Where(c => c.Id == 35).OrderBy(c => c.Name); 

あなたはは、データベースに接続しません。 SQLクエリに変換する操作の論理シーケンスを準備するだけです。


QUESTIONのUPDATE今

、2番目の例の後、ToListメソッド()で、結果を列挙してデータを取得するためにデータベースに接続します。

関連する問題