在OData V4&中订购扩展实体WebAPI V2.2

时间:2015-11-17 08:20:52

标签: entity-framework asp.net-web-api asp.net-web-api2 odata-v4

我目前正致力于通过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这样的查询选项,这些选项也无效。

1 个答案:

答案 0 :(得分:0)

在符合标准的实现中,该语法可有效实现您期望的结果。因此,从一般的角度来看,这里没有问题。

您的实现无法正常运行的事实表明,要么直接使用实体框架作为ORM,要么;或者_messageRepo.Get()手动应用了查询表达式(错误地),和/或没有将其留给EnableQueryAttribute来为您处理。

  • 当诸如_messageRepo.Get()之类的存储库模式方法返回IEnumerable类型的结果而不是IQueryable时,通常会遇到这种情况。
  • 您的函数必须返回一个IQueryable类型的结果,才能正确应用OData查询选项。
  

我意识到这是一篇过时的文章,但是如果$top也不起作用,那么这进一步证明了OP的实现不是 standard 实体框架实现,此基本语法已经从Web API v2的第一个OData v4版本开始支持。