显式加载导航属性

时间:2012-12-07 11:18:33

标签: entity-framework-4 lazy-loading eager-loading

public class MyDbContext: DbContext
{
}
public class Product
{
   public long Id {get; set;}

   public long CategoryId {get; set;}

   [ForeignKey("CategoryId")] 
   public virtual Category Category {get; set;}
}
public class Category
{
   public long Id {get; set;}
   public string Name {get; set;}
}

List<Product> GetProducts()
{
    var context = new MyDbContext();
    var products = context.Set<Product>().ToList();
    var categories = context.Set<Category>().ToList();
    foreach(var product = in products)
    {
        product.Category = categories.First(c => c.Id == product.CategoryId);
    }

    return products;
 }

在这里,我想检索具有最佳性能的相关类别的所有产品。 我首先尝试使用延迟加载,但它会导致许多数据库查询。然后我使用预先加载,但生成的查询脚本不是那么有效,特别是对于复杂的查询。所以我使用了以下方式:

  • 获取所有产品,

  • 获取所有类别和

  • 从提取的类别手动设置产品的导航属性“类别”

我的问题是:

- 即使我手动设置后,EF仍会延迟加载导航属性“类别”吗?

- 是否有更好的解决方案来加载复杂的查询?

1 个答案:

答案 0 :(得分:4)

如果您使用Include

,您将获得最佳效果
var products = context.Set<Product>().Include("Category");

这将在一个查询中加载产品及其类别,而类别属性不会再触发延迟加载。

更好的是扩展方法Includecontext.Set<Product>().Include(p => p.Category);