遅延読み込み/プロキシを使用することによるパフォーマンスの向上は、一度にすべてのデータを取得しないことです。これにより、データベースへのラウンド トリップが速くなり、他のデータベース操作が遅くなったりブロックされたりする可能性が減少します。とにかくすべてのデータをロードすることがわかっている場合、必ずしもパフォーマンスが向上するとは限りません。
そうは言っても、Include(...) を使用できない場合 (GroupBy などの制限により)、いくつかのオプションがあります。
DB への複数回のトリップでデータをロードするには、参照またはコレクション プロパティで Load メソッドを使用して、データにアクセスせずにデータを明示的にロードします。その後、プロキシ生成を無効にできます。( http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx )
例えば:
context.Entry( entityObj ).Reference( "PropertyName" ).Load();
context.Entry( entityObj ).Collection( "PropertyName" ).Load();
一部のプロパティに対してプロキシを使用した遅延読み込みを利用したいが、コンテキストが破棄された後に WCF データ コントラクトのシリアル化が他のプロパティを遅延読み込みしようとするのを回避したい場合は、DB コンテキストのスコープを離れる前にエンティティをデタッチできます。
EntityA a = null;
EntityA a2 = null;
using (var db = new TestEntities())
{
a = db.EntityAs.Where( ea => ea.Id == 1 ).Single();
db.Entry(a).State = System.Data.EntityState.Detached;
a2 = db.EntityAs.Where( ea => ea.Id == 2 ).Single();
}
var b1 = a.EntityB; // c will remain null; no exception thown
var b2 = a2.EntityB; // blows up b/c it attempts to lazy load