1

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

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 的类别 ID 传递给 viewmodel 的 products where 子句。

问题 1:如果我将产品代码移动到单独的子操作中,然后使用 Html.Action 从父视图传递类别模型 ID 从父视图调用该操作,这在性能或其他方面会更好吗?

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

4

1 回答 1

1

问题 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();

这可能会比进行两个单独的查询稍微好一些,但您不太可能会注意到差异。

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

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

于 2013-01-23T20:15:40.087 回答