【问题标题】:Maintaining IQueryable between page lifecycles在页面生命周期之间维护 IQueryable
【发布时间】:2014-08-20 04:42:31
【问题描述】:

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

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

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

  • IQueryable 对象原样保留在内存中的某个位置,以便在下一页/查询等中使用它。除了是一种非常糟糕/低效的做法外,它还会呈现给对象由于 IQueryable 在数据库上下文 (DbContext) 中返回,因此无法使用,因此在释放上下文后将无效。

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

【问题讨论】:

  • 分离查询及其specifications。您可以存储规范并将它们重新应用于查询正文。

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


【解决方案1】:

我不确定您现在如何“编辑”IQueryable。由于您无法撤消 IQueryable 内部的部分,这对我来说听起来是不可能的。

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

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

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

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

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

【讨论】:

  • 通过“编辑”,我的意思是表示一个查询并在另一个页面中更改部分查询(如果后者限制较少,显然,重新往返数据库)
猜你喜欢
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多