2011-04-18 79 views
0

我有一个WCF数据服务带有一个名为MostRecentFilms的自定义操作,该操作返回源中的10个最新电影。除其他外,每部电影均拥有Year财产。一切顺利的默认设置,但是当我设置实体集的页面大小,config.SetEntitySetPageSize("*", 100),返回的电影顺序不好。如果结果集小于100,那么它们无关紧要,它们没有正确地从最近更少的顺序排序,当页面大小限制不存在时它是如何返回的。WCF数据服务(OData),SetEntitySetPageSize和自定义操作有问题

我不知道这是WCF数据服务错误还是我在这里丢失了一些配置。任何帮助澄清这一点将不胜感激。

+0

MostRecentFilms调用明确性是否设置结果的顺序? – klabranche 2011-04-18 21:13:45

回答

2

这实际上是通过设计。服务器驱动分页(SetEntitySetPageSize启用它)的方式要求结果的稳定(并且众所周知)顺序。 因此,该服务将通过给定实体上的所有关键属性来排序服务操作的结果(它也通过实体集来完成)。 客户端可以在一定程度上影响订单 - 如果请求中有$ orderby,则生成的订单将是$ orderby的应用,后跟所有关键属性。 目前服务器上没有办法规定实体集或服务操作的顺序,这样服务器驱动的分页处理将以与客户端的$ orderby相同的方式处理。 您可以让您的客户端添加正确的$ orderby,或者如果这是不可能的,我可以想到的唯一的其他解决方法是将$ orderby注入URL,然后由WCF数据服务处理(这可以通过自定义主机,特殊的头文件,WCF,...取决于你如何主办服务等)。但是,这有点冒险,并且需要您对URL进行半解析才能识别已有的$ orderby。 请注意,此行为不仅适用于服务器驱动的分页,$ top和$ skip将重新排序结果以保持稳定的排序。

+0

感谢Vitek。这里的问题在于,我已经按照电影的年份定义了一个订单,并且由服务器覆盖,就像你说的。可能可以通过QueryInterceptor来管理这种行为,以重新恢复基于年份的订单?有没有办法来处理操作本身,而不需要QueryString中的$ orderby参数? – Lester 2011-04-20 12:47:29

+0

QueryInterceptor不会帮助你,不幸的是,只允许过滤结果,没有别的。除了1)修改URL到服务之前,我真的无法想到其他任何东西,2)实现您自己的自定义分页,这非常困难。 – 2011-04-20 16:18:54

+0

@VitekKarasMSFT,你想谈谈更多关于OData稳定播放的内容吗?我在这里发布了一个问题:http://stackoverflow.com/questions/27685887/whats-the-best-practice-to-do-stable-paging-in-data – RainCast 2014-12-31 05:33:08