Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有筛选和排序功能的服务器端分页_C#_Asp.net_Web Services_Rest_Asp.net Web Api - Fatal编程技术网

C# 具有筛选和排序功能的服务器端分页

C# 具有筛选和排序功能的服务器端分页,c#,asp.net,web-services,rest,asp.net-web-api,C#,Asp.net,Web Services,Rest,Asp.net Web Api,在我们的web应用程序中,有些数据密集型UI页面速度非常慢,而我们现在使用的客户端排序和过滤迫使这些页面从API(JSON)加载所有数据,然后在浏览器中执行操作,这通常意味着页面在准备使用之前会冻结几秒钟。 我们正在研究的解决方案是提供支持过滤和排序的服务器端分页。 对于分页,我们在URL中发送pageIndex和pageSize参数,它工作正常。现在,对于排序(和过滤),我们考虑在JSON对象内部发送要排序(和过滤)的属性的名称,该JSON对象可以被API解析,以生成适当的数据查询。我在这里

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

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

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

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

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


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

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


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

这不是你自己造成的问题吗为什么UI“必须”发送“FirstName”,而不是使用API已经发送给它的相同标识符(例如,
FN
)?像我说的那样传递“FirstName”是最简单的事情。我可以发送“FN”,但我必须添加一些东西,将其转换为“FirstName”,以生成合适的查询。我知道这个解决方案,但我正在尝试找出是否有更好的实践或工具来实现这一点。翻译姓名的开销可能会被您在实际访问数据和执行排序和筛选时产生的开销所淹没,很多次。谢谢@Damien_不信者。我将等待更多的答案,但我认为这是最合理的方式。你能把你的意见写进一个答案里吗?这样,如果我最终使用它,我就可以标记为解决方案了。这不是你自己造成的问题吗为什么UI“必须”发送“FirstName”,而不是使用API已经发送给它的相同标识符(例如,
FN
)?像我说的那样传递“FirstName”是最简单的事情。我可以发送“FN”,但我必须添加一些东西,将其转换为“FirstName”,以生成合适的查询。我知道这个解决方案,但我正在尝试找出是否有更好的实践或工具来实现这一点。翻译姓名的开销可能会被您在实际访问数据和执行排序和筛选时产生的开销所淹没,很多次。谢谢@Damien_不信者。我将等待更多的答案,但我认为这是最合理的方式。你能不能把你的意见写进一个答案,这样我就可以在我最终使用它时标记为一个解决方案?谢谢@tigran。这是在UI使用的“语言”和实际内部“硬编码”名称之间创建“映射器”的多种可能性之一。我不确定我是否喜欢在数据库列名这样的低级别创建此映射。虽然这可能工作得更快,但它留给可操作性的空间更少。例如,在应用程序结构的更高级别创建的映射器将允许我为API的不同客户端创建不同的映射。目前这不是必需的,但我通常更愿意给自己留点空间。@WassimMansour:不,这不是abot映射。服务器注入列“real”(名称用于查询数据)和翻译后的名称或别名。单击一次,UI就将真实名称传递给服务器