(或代替)使用多个部分视图的最佳结构是什么?

时间:2011-03-08 20:21:07

标签: asp.net-mvc performance partial-views renderaction

我有一个视图,调用四个不同的局部视图(.ascx)来通过RenderAction调用填充视图的一部分。每个部分视图使用相同的视图模型,但每个部分视图通过底层模型中自己的EF查询返回不同的数据集。正如您在共享视图模型时所假设的那样,部分视图都返回几乎相同类型的信息 - 不同之处在于过滤。例如。 “新产品”与“热门产品”与“推荐产品”等。

我正在获取我想要的数据,但我需要解决这个问题,因为我的表现非常糟糕。每个单独查询的性能似乎并不太糟糕(我使用过LinqPad并测试了SQL Server中生成的SQL,性能非常好)。但是,总之,当我切换类别并重新加载页面时,页面加载时间非常短。

我可以调用一个提取所有内容(全部4个)然后将结果过滤到各个部分视图中,而不是对SQL服务器调用4个查询吗?这会更好吗?

非常感谢您的建议/意见。

1 个答案:

答案 0 :(得分:0)

是。做一个查询和过滤会好得多。

List<Widgets> widgetsFromQuery = (from w in db.Widgets 
where w.Name.EndsWith("-sprocket") || 
w.Name.EndsWith("-seat") || 
w.Name == "toaster"
select c).ToList();

最后调用ToList(),迫使Linq立即执行查询。

然后使用widgetsFromQuery作为模型,并在每个视图中过滤如下:

var filteredModel = Model.Select(w => w.Name.EndsWith("-sprocket"));
var filteredModel = Model.Select(w => w.Name.EndsWith("-seat"));
var filteredModel = Model.Select(w => w.Name == "toaster"));

进一步的性能增强将类似于:

1)在会话中缓存查询的输出(如果是特定于用户的)或如果不是,则缓存应用程序缓存。

2)将每个视图绑定到一个动作,使用AJAX加载,并对动作使用输出缓存属性。