我有一个MVC项目,我使用EF从Northwind数据库引入Products和Categories表。 Products表对Categories表的CategoryID字段的CategoryID具有外键约束。我使用向导使用EF添加带有视图的MVC 5控制器。 Index操作方法具有此代码
// GET: Products
public ActionResult Index()
{
var products = db.Products.Include(p => p.Category);
return View(products.ToList());
}
我认为.include可以引入类别并允许类别名称显示在视图中。但后来我查看了详细信息操作方法,即使它确实显示了类别名称,也不会使用此代码。所以我尝试从索引方法中删除.include来获取此
var products = db.Products;
并运行它,我仍然在视图中显示类别名称。所以现在我很困惑为什么.include代码在Index动作方法中而不在Details方法中。任何意见都表示赞赏。
由于
答案 0 :(得分:5)
Include
对底层SQL查询有影响。使用它时,查询将在Category表上执行连接,否则,查询将仅加载Products表中的数据。如果启用了延迟加载(默认情况下),则在访问该属性时将从数据库加载Category。
从应用程序中,这意味着您可以得到完全相同的结果。区别在于,Include
只会生成一个查询,如果没有它,您将有一个查询来检索产品列表,然后每次需要访问第一个产品类别时再查询一个时间。性能影响可能很大(这被称为N + 1问题,因为要加载N个项目的列表,您必须对数据库进行N + 1次往返)。