Entity Frameworkによって実際に発行されたSQLコマンドをプロファイリングすることから始めるべきです。構成(POCO、自己追跡エンティティ)によっては、最適化の余地がたくさんあります。ObjectSet<T>.ToTraceString()
メソッドを使用してSQLコマンドをデバッグできます(デバッグモードとリリースモードで違いはありません)。さらに最適化が必要なクエリが発生した場合は、いくつかの予測を使用して、EFが達成しようとしていることに関する詳細な情報を提供できます。
例:
Product product = db.Products.SingleOrDefault(p => p.Id == 10);
// executes SELECT * FROM Products WHERE Id = 10
ProductDto dto = new ProductDto();
foreach (Category category in product.Categories)
// executes SELECT * FROM Categories WHERE ProductId = 10
{
dto.Categories.Add(new CategoryDto { Name = category.Name });
}
置き換えることができます:
var query = from p in db.Products
where p.Id == 10
select new
{
p.Name,
Categories = from c in p.Categories select c.Name
};
ProductDto dto = new ProductDto();
foreach (var categoryName in query.Single().Categories)
// Executes SELECT p.Id, c.Name FROM Products as p, Categories as c WHERE p.Id = 10 AND p.Id = c.ProductId
{
dto.Categories.Add(new CategoryDto { Name = categoryName });
}
私は頭からそれを入力したので、これは正確に実行される方法ではありませんが、EFは実際にクエリについて知っているすべてを伝えると、いくつかの素晴らしい最適化を実行します(この場合、カテゴリが必要になります-名前)。ただし、プロジェクションはロードするデータの量をさらに削減できるため、これは熱心なロード(db.Products.Include( "Categories"))とは異なります。