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仍会延迟加载导航属性“类别”吗?
- 是否有更好的解决方案来加载复杂的查询?
答案 0 :(得分:4)
如果您使用Include
:
var products = context.Set<Product>().Include("Category");
这将在一个查询中加载产品及其类别,而类别属性不会再触发延迟加载。
更好的是扩展方法Include
:context.Set<Product>().Include(p => p.Category);
。