我有一个视图,调用四个不同的局部视图(.ascx)来通过RenderAction调用填充视图的一部分。每个部分视图使用相同的视图模型,但每个部分视图通过底层模型中自己的EF查询返回不同的数据集。正如您在共享视图模型时所假设的那样,部分视图都返回几乎相同类型的信息 - 不同之处在于过滤。例如。 “新产品”与“热门产品”与“推荐产品”等。
我正在获取我想要的数据,但我需要解决这个问题,因为我的表现非常糟糕。每个单独查询的性能似乎并不太糟糕(我使用过LinqPad并测试了SQL Server中生成的SQL,性能非常好)。但是,总之,当我切换类别并重新加载页面时,页面加载时间非常短。
我可以调用一个提取所有内容(全部4个)然后将结果过滤到各个部分视图中,而不是对SQL服务器调用4个查询吗?这会更好吗?
非常感谢您的建议/意见。
答案 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加载,并对动作使用输出缓存属性。