我目前正致力于通过aspnet Web API V2.2使用OData V4构建API。
总之,我正在调用并扩展属性,并希望按日期订购扩展属性:
http://localhost/odata/Messages?$expand=children($orderby=dateCreated desc)
子集合是同一类型的父/子自引用。问题不是孩子们通过,而是他们通过的顺序。此数据库的PKID使用GUID,因此记录不会以任何特定顺序通过。我要求子集合按其创建日期排序。
根据OData语法,这非常好,但结果没有正确排序。
不知道OData是如何工作的,我的实体框架调用如下所示(使用lambda):
_messageRepo.Get()
它只是通过IQueryable<T>
从底层数据库返回类型DbSet<>
。
之前已经在SO和其他一些论坛上提出了这个问题,但没有什么是真正的结论。另外,我已经看到一些简单地单独调用数据的响应,这也是一个选项,但我想知道这是否已根据OData V4规范实现,如果是,那么如何实现呢。
更新
我也尝试使用像$top
这样的查询选项,这些选项也无效。
答案 0 :(得分:0)
在符合标准的实现中,该语法可有效实现您期望的结果。因此,从一般的角度来看,这里没有问题。
您的实现无法正常运行的事实表明,要么直接使用实体框架作为ORM,要么不;或者_messageRepo.Get()
手动应用了查询表达式(错误地),和/或没有将其留给EnableQueryAttribute
来为您处理。
_messageRepo.Get()
之类的存储库模式方法返回IEnumerable
类型的结果而不是IQueryable
时,通常会遇到这种情况。IQueryable
类型的结果,才能正确应用OData查询选项。我意识到这是一篇过时的文章,但是如果
$top
也不起作用,那么这进一步证明了OP的实现不是 standard 实体框架实现,此基本语法已经从Web API v2的第一个OData v4版本开始支持。