WCF数据服务(OData)、SetEntitySetPageSize和自定义操作存在问题

WCF数据服务(OData)、SetEntitySetPageSize和自定义操作存在问题,wcf,rest,odata,wcf-data-services,Wcf,Rest,Odata,Wcf Data Services,我有一个名为MostRecentFilms的自定义操作的WCF数据服务,它返回源中最近的10部电影。每部电影都有一个年份属性。默认设置一切正常,但当我为实体集设置页面大小时,config.SetEntitySetPageSize(“*”,100),返回的胶片顺序不好。不管结果集的大小是否小于100,它们的顺序都不正确,从“最近”到“更少”,以及在不存在页面大小限制时如何返回 我不知道这是不是一个WCF数据服务错误,或者我是否缺少一些配置。任何澄清这一点的帮助都将不胜感激。这实际上是有意为之。服务

我有一个名为
MostRecentFilms
的自定义操作的WCF数据服务,它返回源中最近的10部电影。每部电影都有一个
年份
属性。默认设置一切正常,但当我为实体集设置页面大小时,
config.SetEntitySetPageSize(“*”,100)
,返回的胶片顺序不好。不管结果集的大小是否小于100,它们的顺序都不正确,从“最近”到“更少”,以及在不存在页面大小限制时如何返回


我不知道这是不是一个WCF数据服务错误,或者我是否缺少一些配置。任何澄清这一点的帮助都将不胜感激。

这实际上是有意为之。服务器驱动分页(SetEntitySetPageSize启用它)的实现方式需要稳定(并且众所周知)的结果顺序。 因此,服务将根据给定实体上的所有键属性对服务操作的结果进行排序(它也会对实体集进行排序)。 客户端可以在一定程度上影响排序-如果请求中有$orderby,则生成的排序将是$orderby的应用程序,后跟所有键属性。 目前,服务器上没有办法规定实体集或服务操作的顺序,这样服务器驱动的分页处理就会像处理来自客户端的$orderby一样考虑它。 您可以让您的客户端添加正确的$orderby,或者如果不可能的话,我能想到的唯一其他解决方法是在URL被WCF数据服务处理之前将$orderby注入URL(这可以通过自定义主机、特殊头、WCF等来完成,具体取决于您如何承载服务等等)。但这有点不太靠谱,需要对URL进行半解析,以便能够识别已经存在的任何$orderby。
请注意,此行为不仅适用于服务器驱动的分页,而且$top和$skip将对结果重新排序,以保持稳定的排序。

MostRecentFilms调用是否明确设置了结果的顺序?谢谢Vitek。这里的问题是,我已经定义了一个订单,基于电影的年份,它被服务器覆盖,正如你所说的。是否可以从查询接收者处管理此行为,以根据年份再次恢复订单?有没有一种方法可以在操作本身内部处理这个问题,而不需要QueryString中的$orderby参数?不幸的是,QueryInterceptor对您没有帮助,它只允许过滤结果,其他什么都不允许。除了1)在URL进入服务之前修改URL,2)实现您自己的自定义分页,这是非常困难的。@Vitekkarasmssft,您想更多地谈谈OData中的稳定分页吗?我在这里发布了一个问题: