在页面生命周期之间保持IQueryable

时间:2014-06-29 19:28:27

标签: asp.net asp.net-mvc linq entity-framework iqueryable

我有一个ASP.NET MVC 5 / Entity Framework网站,网站用户可以在一组用户/项目等上构建复杂查询,排序/过滤等等。但是,我需要一种方法来维护查询和#34;状态"在页面循环之间,将它们发送到其他页面以进行进一步操作等。以下是我考虑过的一些方法:

  • 将所有查询结果转换为IEnumerable(或列表):这将是非常低效的,因为我需要加载和枚举内存中列表的所有用户,其中我可能只需要它们的一小部分(我正在使用分页)。

  • 使用ToString方法将查询转换为原始SQL。但是,这样,虽然我可以分页和查询,但我仍然无法编辑查询。

  • IQueryable对象保留在内存中的某个位置,以便在下一页/查询等中使用它。这个除了是一个非常糟糕/低效的练习外,还会渲染由于IQueryable在数据库上下文(DbContext)内返回,因此对象不可用,因此在处理上下文后将无效。

维持"状态"的最佳做法是什么?页面生命周期之间的查询对象?服务器端和客户端解决方案都被接受,只要它们符合我的要求(不将整个数据库加载到内存中,能够在执行后修改查询,分页,排序......)

1 个答案:

答案 0 :(得分:2)

我不确定你现在如何“编辑”IQueryable。因为你无法撤销IQueryable里面的部分,这对我来说是不可能的。

恕我直言,您需要分离查询的定义和查询的执行。

我将存储在自定义解决方案中的定义。它可以是任何东西,定义一些类来存储用户定义的查询,它可能包含某种类型的集合,以表示用户在视图中看到的内存。

要执行查询,您必须将用户定义的查询转换为可以在数据库上执行的实际查询。它可以是原始SQL,但IQueryable也同样好。

如果您将用户定义的查询序列化,这不应该是一个问题,因为您自己定义它,您可以简单地将序列化的“状态”保存在页面中,例如隐藏字段。

在您想要执行查询之前,您实际上也不需要IQueryable对象。