Entity framework 订购OData V4中的扩展实体&;WebAPI V2.2
我目前正在通过aspnetwebapi V2.2使用odatav4构建一个API 总之,我打电话给expanded property,希望按日期订购expanded property,如下所示: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,因此记录不会以任何特定顺序通过。我要求子
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
- 函数必须返回一个
类型化的结果,才能正确应用OData查询选项IQueryable
$top
也不起作用,那么这进一步证明OP的实现不是一个标准的实体框架实现,这一基本语法从Web API v2中的OData v4的第一个版本开始就得到了支持
谢谢你的回复。在发布之前,我确实创建了一个香草EF应用程序来测试它,没有任何转换来达到相同的效果。如果我有一个不同类型的子集合,没有问题,只有当它的类型相同时,它的子排序才有问题。你上面提到的一切都没有实现/不正确,只是当时不起作用。但你最终解决了这个问题吗?这是一种问题,如果我能看到所有的代码,那么这里或那里的一些调整可能会很快解决它,这种查询在没有任何阻碍的情况下“只起作用”。