Entity framework 订购OData V4中的扩展实体&;WebAPI V2.2

Entity framework 订购OData V4中的扩展实体&;WebAPI V2.2,entity-framework,asp.net-web-api,asp.net-web-api2,odata,Entity Framework,Asp.net Web Api,Asp.net Web Api2,Odata,我目前正在通过aspnetwebapi V2.2使用odatav4构建一个API 总之,我打电话给expanded property,希望按日期订购expanded property,如下所示: http://localhost/odata/Messages?$expand=children($orderby=dateCreated desc) 子集合是相同类型的父/子自引用。问题不在于孩子们能挺过来,而是他们挺过来的顺序。此数据库的PKID使用GUID,因此记录不会以任何特定顺序通过。我要求子

我目前正在通过aspnetwebapi V2.2使用odatav4构建一个API

总之,我打电话给expanded property,希望按日期订购expanded property,如下所示:

http://localhost/odata/Messages?$expand=children($orderby=dateCreated desc)

子集合是相同类型的父/子自引用。问题不在于孩子们能挺过来,而是他们挺过来的顺序。此数据库的PKID使用GUID,因此记录不会以任何特定顺序通过。我要求子集合按其创建日期排序

根据OData语法,这是非常好的,但是结果的顺序不正确

由于不知道OData在幕后如何工作,我的实体框架调用如下所示(使用lambda):

\u messageRepo.Get()

它只是通过
DbSet
根据EF从底层数据库返回类型
IQueryable

这个问题以前在SO和其他一些论坛上被问过,但没有什么是真正的结论。另外,我看到了一些单独调用数据的响应,这也是一个选项,但我想知道这是否已根据OData V4规范实现,如果是,如何实现

更新
我还尝试过使用诸如
$top
之类的查询选项,但这些选项也不起作用。

在兼容实现下,语法是有效的,可以实现您期望的结果。所以从总体上看,这里没有问题

您的实现行为不正确这一事实表明,在后台,它没有直接使用实体框架作为ORM,或者
\u messageRepo.Get()
正在手动应用查询表达式(错误),和/或它没有留给
EnableQueryAttribute
为您处理

  • 当存储库模式方法(如
    \u messageRepo.Get()
    返回
    IEnumerable
    类型化结果,而不是
    IQueryable
    时,通常会遇到这种情况
  • 函数必须返回一个
    IQueryable
    类型化的结果,才能正确应用OData查询选项
我意识到这是一篇老文章,但如果
$top
也不起作用,那么这进一步证明OP的实现不是一个标准的实体框架实现,这一基本语法从Web API v2中的OData v4的第一个版本开始就得到了支持


谢谢你的回复。在发布之前,我确实创建了一个香草EF应用程序来测试它,没有任何转换来达到相同的效果。如果我有一个不同类型的子集合,没有问题,只有当它的类型相同时,它的子排序才有问题。你上面提到的一切都没有实现/不正确,只是当时不起作用。但你最终解决了这个问题吗?这是一种问题,如果我能看到所有的代码,那么这里或那里的一些调整可能会很快解决它,这种查询在没有任何阻碍的情况下“只起作用”。