0

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

我得到了我想要的数据,但我需要解决结构问题,因为我的表现很差。每个单独查询的性能似乎都不算太差(我使用过 LinqPad 并在 SQL Server 中测试了生成的 SQL,性能非常好)。然而,总的来说,页面加载时间很差,因为我切换类别并重新加载页面。

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

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

4

1 回答 1

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 加载,并在动作上使用输出缓存属性。

于 2011-03-08T20:23:48.617 回答