Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc Asp Net MVC视图性能和代码逻辑_Asp.net Mvc - Fatal编程技术网

Asp.net mvc Asp Net MVC视图性能和代码逻辑

Asp.net mvc Asp Net MVC视图性能和代码逻辑,asp.net-mvc,Asp.net Mvc,我有一个视图,在我的应用程序中显示产品和相应的类别详细信息。它继承自viewmodel,以便获取我需要显示的产品和类别信息 public ViewResult Index(string id, int page = 1, int pagesize = 10) { var viewModel = new PagedProductList() { CurrentPageIndex = page, PageSize

我有一个视图,在我的应用程序中显示产品和相应的类别详细信息。它继承自viewmodel,以便获取我需要显示的产品和类别信息

public ViewResult Index(string id, int page = 1, int pagesize = 10)
    {
        var viewModel = new PagedProductList()
        {
            CurrentPageIndex = page,
            PageSize = pagesize
        };

        viewModel.category = db.Category.First(c => c.Id == id);

        viewModel.products = db.Product
            .Where(i => i.Category.Id == viewModel.category.Id)
            .OrderBy(i => i.Id)
            .Skip((viewModel.CurrentPageIndex - 1) * viewModel.PageSize)
            .Take(viewModel.PageSize)
            .Include(p => p.ProductAttributeValues);

        return View(viewModel);
    }
如您所见,我正在将viewmodel的category id传递给viewmodel的products where子句

问题1:如果我在一个单独的子操作中移动产品代码,然后使用Html.action从父视图调用该操作并从父视图传递类别模型id,那么这在性能或其他方面是否会更好


问题2:是否有其他更好的方法来获取类别信息和相应的产品。我不能使用诸如db.Category.Include(“产品”)之类的东西,因为我将无法对产品进行分页。

问题1:不,这样会比较慢。调用操作(即查找和设置控制器)会带来开销。最终结果仍然是发出两个查询

问题2:您可以使用投影在单个查询中获得所需内容(通过分类和分页导航类别的产品):

var data = db.Category
             .Select(c => new 
             {  
                c, 
                Products = c.Products
                            .OrderBy(p => p.Id)
                            .Skip((viewModel.CurrentPageIndex - 1) * viewModel.PageSize)
                            .Take(viewModel.PageSize)
                            .Select(p => new { p, p.ProductAttributeValues })
            })
            .Single(c => c.Id == viewModel.category.Id);
viewModel.category = data.c;
viewModel.products = data.c.Products.Select(p => p.p).ToList();
这可能会比进行两个单独的查询稍微好一点,但您不太可能注意到差异

但是,您必须权衡稍微好一点的性能带来的好处和代码可读性降低带来的好处。如果您没有实际的性能问题(我猜您没有),那么您就是在浪费时间优化性能在优化之前,您应该一直等到出现实际可测量的性能问题,除非使用更复杂的代码有显著的性能优势,否则您应该始终支持可读性。


注意:对更复杂的查询使用类似的模式实际上可能比发出两个或多个查询来获取所需的数据要慢

问题1:不,会慢一些。调用操作(即查找和设置控制器)会带来开销。最终结果仍然是发出两个查询

问题2:您可以使用投影在单个查询中获得所需内容(通过分类和分页导航类别的产品):

var data = db.Category
             .Select(c => new 
             {  
                c, 
                Products = c.Products
                            .OrderBy(p => p.Id)
                            .Skip((viewModel.CurrentPageIndex - 1) * viewModel.PageSize)
                            .Take(viewModel.PageSize)
                            .Select(p => new { p, p.ProductAttributeValues })
            })
            .Single(c => c.Id == viewModel.category.Id);
viewModel.category = data.c;
viewModel.products = data.c.Products.Select(p => p.p).ToList();
这可能会比进行两个单独的查询稍微好一点,但您不太可能注意到差异

但是,您必须权衡稍微好一点的性能带来的好处和代码可读性降低带来的好处。如果您没有实际的性能问题(我猜您没有),那么您就是在浪费时间优化性能在优化之前,您应该一直等到出现实际可测量的性能问题,除非使用更复杂的代码有显著的性能优势,否则您应该始终支持可读性。


注意:对更复杂的查询使用类似的模式实际上可能比发出两个或多个查询来获取所需的数据要慢

我认为您误解了视图模型的用途。您不应该将数据库访问权限放在其中。话虽如此,您是否有任何特定的性能问题?如果没有,那么进一步的优化是不必要的。实际上,我没有把数据库访问放在viewmodel中。这是在我发布的控制器代码中完成的。这是暂时的,因为在我完成评估后,我会将其移动到存储库中。事实上,是的,你是。当您将查询分配给产品时,您正在分配一个IQueryable,它在您迭代时实际执行数据库调用,它将出现在您的视图中。它还将实体返回到您的视图,这完全忽略了视图模型的点。好吧,我明白了,我必须将查询分配给一个变量,并将结果分配给viewmodel,对吗?不。变量不会改变任何东西,它只是一个隐式类型定义。但这些都与我的观点无关。你真的有性能问题吗?如果没有,那你为什么还要担心呢?我想你误解了视图模型的目的。您不应该将数据库访问权限放在其中。话虽如此,您是否有任何特定的性能问题?如果没有,那么进一步的优化是不必要的。实际上,我没有把数据库访问放在viewmodel中。这是在我发布的控制器代码中完成的。这是暂时的,因为在我完成评估后,我会将其移动到存储库中。事实上,是的,你是。当您将查询分配给产品时,您正在分配一个IQueryable,它在您迭代时实际执行数据库调用,它将出现在您的视图中。它还将实体返回到您的视图,这完全忽略了视图模型的点。好吧,我明白了,我必须将查询分配给一个变量,并将结果分配给viewmodel,对吗?不。变量不会改变任何东西,它只是一个隐式类型定义。但这些都与我的观点无关。你真的有性能问题吗?如果没有,那你为什么还要担心呢?