EF4の遅延ロード

先日blogでEF4と書きましたが、次期バージョンの.NET Framework 4.0に搭載されるADO.NET Entity Frameworkということで、USではEF4が省略形になっています。今日はEF4に搭載される遅延ロード(Lazy Load)をご紹介したいと思います。

現行の.NET 3.5 SP1に搭載されているEF v1はLINQ to SQLと異なり遅延ロードには対応していませんでした。よって下記のようにLoad()、Include()を呼び出す必要があります。そのためコードが若干、煩雑になるというデメリットがありました。

■パターン1

pubsEntities db = new pubsEntities();

var authors = db.authors;

foreach (var author in authors)

{

Console .WriteLine(author.au_lname);

if (!author.titleauthors.IsLoaded) author.titleauthors.Load();

Console .WriteLine(author.titleauthors.Count());

}

■パターン2

var authors = db.authors.Include("titleauthors");

foreach (var author in authors)

{

Console .WriteLine(author.au_lname);

Console .WriteLine(author.titleauthors.Count());

}

 

 

 

 

EF4では下記のようにdb.ContextOptions.DeferredLoadingEnabled = true;と記述することで、遅延ロードに対応します。ただし、この処理ではauthorsテーブルのレコード一件毎にtitleauthorsをCountするためのSQL文が実行されます。ラウンドトリップが増加するためパフォーマンスに問題が生じてしまう可能性があります。このことは上述したパターン1でも同じことが言えます。このような繰り返し処理をともなうプログラムでは、titileauthorsも含めて一発で取得できるパターン2を利用するべきです。

■パターン3

db.ContextOptions.DeferredLoadingEnabled = true;

var authors = db.authors;

foreach (var author in authors)

{

Console .WriteLine(author.au_lname);

Console .WriteLine(author.titleauthors.Count());

}