Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
先日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());
}
Comments
Anonymous
May 25, 2009
PingBack from http://microsoft-sharepoint.simplynetdev.com/ef4%e3%81%ae%e9%81%85%e5%bb%b6%e3%83%ad%e3%83%bc%e3%83%89/Anonymous
June 16, 2009
前回 は EF4 で追加される予定の POCO を解説しました。 V1 ではエンティティをデータ層として利用すべきか、ドメイン層で利用すべきか、という白熱した??議論がありました。 EF4 では POCO