【发布时间】:2021-05-01 15:29:39
【问题描述】:
简单的 OData 查询很简单,如果所有内容在编译时都是已知的。我已经学会了如何在运行时构建表达式以进行过滤,但我还没有完全弄清楚如何在运行时构建 OrderBy 表达式?
查询模型示例(动态过滤器表达式):
var empls = await client.For<MyModel>("MyTable")
.Top(request.PageSize)
.Skip((request.Page - 1) * request.PageSize)
.Filter(filter)
.FindEntriesAsync();
如果我在编译时知道需要什么顺序,我可以添加一个 .OrderBy() 子句。但是由于用户在运行时决定排序,所以我需要构建一个排序表达式。
为了动态构建上面传递的过滤器,我使用了 ODataExpression 对象。我正在寻找传递给 order 子句的等效功能(如果存在的话?)。
【问题讨论】:
-
嗯,你是什么意思? Odata 用于动态过滤,因此它在运行时运行。您应该使用 Odata 元数据来构建查询。
-
我将举例说明。我有一个 Kendo 网格用来查询数据的 MVC 控制器方法。如果我确信只有合理数量的记录返回到网格,我可以将它们全部返回并让网格在客户端管理过滤和排序。但是,如果我实现服务器端分页,这意味着服务器端代码需要根据网格为过滤器和排序传递的内容来管理过滤和排序(以响应网格上的用户操作)。
-
以同样的方式对待他们。 1. 为这些端点设置足够高的页面大小,以便它们在一个页面中全部返回。 2. OData 具有内置的分页和过滤功能,例如
Products?$top=10&$skip=203. 您可以将 ODataQuery 应用于现有的 IQueryable,例如让您的控制器接收ODataQueryOptions<Product> options,然后您可以调用options.ApplyTo(_products.AsQueryable()) -
重点是处理未知数量的记录,数千甚至数百万。我不一定能一次加载所有记录。用户决定页面大小。分页不是问题。 OrderBy 是目前唯一需要解决的问题。
-
你对什么感到困惑? OData 提供允许您从客户端构建过滤器的元数据。您正在手动尝试在 api 中应用过滤器。可能是因为默认实现有其局限性。所以将你的默认查询传递给 QueryOptions 并使用 apply 来处理过滤和排序。
标签: odata