2
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 仍然会延迟加载它吗?

-对于复杂查询的急切加载,有没有更好的解决方案?

4

1 回答 1

4

如果你使用,你会得到最好的结果Include

var products = context.Set<Product>().Include("Category");

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

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

于 2012-12-07T14:18:52.290 回答