【问题标题】:Server-side paging with filtering and sorting带有过滤和排序的服务器端分页
【发布时间】:2013-06-28 05:32:18
【问题描述】:

在我们的 Web 应用程序中,我们有一些非常慢的数据密集型 UI 页面,而我们现在使用的客户端排序和过滤会强制这些页面从 API 加载所有数据(以 JSON 格式)和然后在浏览器中执行操作,这通常意味着页面在准备好使用之前会冻结几秒钟。 我们正在研究的解决方案是提供支持过滤和排序的服务器端分页。

对于分页,我们在 URL 中发送 pageIndex 和 pageSize 参数,它工作正常。现在对于排序(和过滤),我们正在考虑发送属性的名称以在 JSON 对象中进行排序(和过滤),该 JSON 对象可以由 API 解析以生成正确的数据查询。我在这里遇到的问题是,为了使事情尽可能简单和快速,UI 页面必须“知道”他们想要对数据进行排序(或过滤)数据的数据列名称,这是不可取的。

例如,API 在名为“FN”的属性中(在 JSON 对象中)发送用户名;但是,要让 API 按名字对用户进行排序,UI 必须发送“FirstName”作为排序属性,这是我数据库中列的名称。这种方法允许我将属性的名称直接传递给我的数据层并快速完成工作。然而,用户界面需要识别数据库中数据表的列名,这几乎破坏了在层之间分离关注点的整个想法(这是我们将 Web 应用程序分解为单独的 API 和用户界面)。

有没有一种干净的方法来为服务器端分页提供过滤和排序,而不会在 UI 和后端之间创建这种依赖关系?

谢谢你。

【问题讨论】:

  • 这不是你自己造成的问题吗? - 为什么 UI“必须”发送“FirstName”而不是使用您的 API 已经发送给它的相同标识符(例如FN)?
  • 像我说的那样传递“名字”是最简单的事情。我可以发送“FN”,但随后我必须添加一些内容以将其翻译为“FirstName”以生成合适的查询。我知道这个解决方案,但我正在尝试找出是否有更好的做法或工具来完成这项工作。
  • 翻译名称的开销可能会被实际访问数据和执行排序和过滤所产生的开销所淹没。跨度>
  • 谢谢@Damien_The_Unbeliever。我将等待更多的答案,但我认为这是最合理的方法。您能否将您的 cmets 设为答案,以便我在最终使用它时将其标记为解决方案?

标签: c# asp.net web-services rest asp.net-web-api


【解决方案1】:

这里没有什么问题。不知道您的应用程序的结构如何确切,但假设我们有一个包含 2 列(Acol、Bcol)的表。列的name 是写在列本身的属性中(Acol:“First name”、“LastName”或意大利语“Nome”、“Cognome”,谁在乎..),因此,当用户以某种方式请求排序或过滤时,您不会传递列的固定名称,而是传递该列的属性中存在的字符串。谁在列上设置属性?服务器。

因此服务器为列设置别名(真实名称,可能会被翻译以适应客户端的本地化上下文),而客户端所做的只是将该字符串传递给服务器,甚至不了解它的用途,因为服务器知道该怎么做。

【讨论】:

  • 谢谢@tigran。这是在 UI 使用实际内部“硬编码”名称的“语言”之间创建“映射器”的众多可能性之一。我不确定我是否喜欢在数据库列名这样低级别创建此映射的想法。虽然这可能工作得更快,但它留下的可操作空间更小。例如,在应用程序结构的更高级别创建的映射器将允许我为 API 的不同客户端创建不同的映射。目前这不是必需的,但我通常更愿意给自己留一些肘部空间。
  • @WassimMansour:不,这不是地图绘制。 Server 注入列“real”(名称用于查询数据)和翻译后的名称或别名。单击一次,UI 只是传递给服务器真实名称,因此 UI 不做任何映射,只需获取某个已知字段中存在的值并说:“服务器,按字段排序”+ 找到了字段名称。所以 UI 唯一必须知道的是,colun 的真实名称在哪里,但那是什么,它是如何管理的,从 UI 的角度来看完全无关紧要。所以你保持 UI-BL 解耦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 2019-04-30
  • 2011-11-05
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多