可能这是一个简单的问题,但经过一段时间的研究后,我仍然比开始时更困惑,因为我觉得我的情况非常特别。首先说,我是MVC的新人,所以,我还在学习.net mvc架构。
我会告诉你我的用例。
我有一个页面,用户可以执行产品搜索,可能有大约10到15个过滤器。一个查询可能需要不到一秒或超过10秒,所有这些都取决于过滤器的复杂性。搜索在具有超过500万条记录的数据库中执行。
搜索完成后,用户可以选择按多个属性排序,搜索特定字符串等。所以,想象一下,我的上次搜索需要10秒钟,对数据库进行查询始终是一个好主意,用户想要重新排序产品列表。
目前,我正在使用Session范围来存储从数据库返回的结果的IEnumerable。然后,如果我想对返回的数据执行一些过滤之王,我会在该列表上工作。这真的很快,做我想做的事。
但我有一些良知问题。会话上下文在我看来并不适合临时存储这种信息。主要原因是当我在特定的页面(控制器)时,我只想访问该信息。如果我退出该页面,我的目标是删除信息。
我的问题是关于此,会话上下文是执行此操作的最佳位置?以及如何保证当我退出该控制器时,信息被删除。
希望我澄清。
答案 0 :(得分:1)
最终,Session.Context似乎不是存储此类信息的合法位置。
在我的项目中,我通常在每个用户过滤器上查询信息,虽然我们的数据库相当少,查询执行速度非常快,我们使用AJAX调用来改善用户体验。
在您的环境中,我会选择以下两种方法之一:
1)如果数据结果集很容易适合您的模型类,并且通常由几个元素组成:
然后,您可以尝试将结果集传递回管理筛选搜索的控制器。允许您的业务类过滤先前的数据集或查询数据库(如果它没有以前的结果集)。
2)结果集的数据结构很复杂,并且模型绑定器不能直接将其加载回控制器,或者只是结果集有很多结果,所以从客户端到服务器来回传递这么多结果似乎是一个坏主意:
在这种情况下,我可能会选择使用javascript的客户端解决方案。当任何用户对数据库进行查询或者只是重新构造以前的查询时,我会有所不同。在第一种情况下,我将调用一个返回结果集的控制器,在第二种情况下,我将在客户端代码上创建一个过滤引擎。
要将结果集转换为可以通过javascript轻松管理的数据结构,请使用JSON。
答案 1 :(得分:1)
首先,500万条记录并不是什么大不了的事。
缓存真的取决于你的设置,你的查询,但我会从优化SQL查询开始,并确保他们使用索引