MVC自动生成索引方法 - 为什么需要.include?

时间:2017-01-10 14:20:42

标签: c# asp.net-mvc entity-framework

我有一个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方法中。任何意见都表示赞赏。

由于

1 个答案:

答案 0 :(得分:5)

Include对底层SQL查询有影响。使用它时,查询将在Category表上执行连接,否则,查询将仅加载Products表中的数据。如果启用了延迟加载(默认情况下),则在访问该属性时将从数据库加载Category。

从应用程序中,这意味着您可以得到完全相同的结果。区别在于,Include只会生成一个查询,如果没有它,您将有一个查询来检索产品列表,然后每次需要访问第一个产品类别时再查询一个时间。性能影响可能很大(这被称为N + 1问题,因为要加载N个项目的列表,您必须对数据库进行N + 1次往返)。