特に「大規模な」データグリッドに対して生成される SQL クエリの数を最小限に抑えるために、(.Include() を使用して) 関連するエンティティを熱心に読み込みます。POCO では、関連するエンティティはパブリックな仮想ナビゲーション プロパティです。つまり、それらは遅延ロードされます。プロジェクトの他の部分に最も適しているため、これらの関連エンティティを遅延読み込みするデフォルトの動作を維持したいと考えています。
さて、関連するエンティティをeager-loadした後でも、かなりの量のクエリが生成されていることがわかります。そして、これは関連するエンティティが nullである場合のみのクエリです(SQL 結合が関連するデータを「見つけられなかった」ため、null になります)。
これにより、後でプレゼンテーション層でそれらにアクセスするとすぐに、EF がそれらのエンティティを (まだ読み込まれていないと考えて) 遅延読み込みしようとしていると信じるようになりました。
何か基本的なことを見逃していますか、またはこの問題を回避する方法はありますか?
サンプル コード
リポジトリ パターンを使用して、いくつかの単純化された方法 (ページング、並べ替え、フィルタリングなどを省略) を次に示します。
汎用リポジトリの Get メソッド
public IEnumerable<T> Get(
Expression<Func<T, object>>[] includes = null)
{
IQueryable<T> query = set;
...
// Include properies for eager loading
if (includes != null)
{
query = includes.Aggregate(query,
(current, include) => current.Include(include));
}
...
return query.ToList();
}
上記はサービスクラスから呼び出され、このようなものです
...
context.Licenses.Get(
includes: new Expression<Func<License, object>>[] { l => l.Comment }
);
...
ライセンス POCO
public class License
{
public License()
{
}
// Primitive properties
public string ID { get; set; }
public string Name { get; set; }
...
// Navigation properties
public virtual LicenseComment Comment { get; set; }
...
}
ライセンスコメント POCO
public class LicenseComment
{
public LicenseComment()
{
}
// Primitive properties
public string LicenseID { get; set; }
public string Comment { get; set; }
}
MVC Razor ビュー (またはそのためのモデル) でプロパティにアクセスする
<span>@license.Comment</span>
null の License.Comment にアクセスしようとすると (SQL Server Profiler で調べた)、追加の SQL クエリが生成されます。これは、このプロパティを熱心に含めたにもかかわらず、Entity Framework の遅延読み込みが開始されたように思えます。