简单的 OData 客户端 - 在运行时创建 OrderBy 表达式?
Simple OData Client - create OrderBy expression at runtime?
简单的 OData 如果在编译时知道所有内容,查询就很简单。我已经了解了如何在运行时构建表达式以进行过滤,但我还没有完全弄清楚如何在运行时构建 OrderBy 表达式?
查询模型示例(动态过滤器表达式):
var empls = await client.For<MyModel>("MyTable")
.Top(request.PageSize)
.Skip((request.Page - 1) * request.PageSize)
.Filter(filter)
.FindEntriesAsync();
如果我在编译时知道需要什么顺序,我可以添加一个 .OrderBy() 子句。但是由于用户在运行时决定排序,所以我需要构建一个排序表达式。
为了动态构建上面传递的过滤器,我使用了 ODataExpression<> 对象。我正在寻找传递给订单子句的等效功能(如果存在?)。
无需在单个语句中编写和执行 OData 请求。简单 OData API 旨在让您有选择地构建查询以在您进行时实施您的业务逻辑。
需要知道升序和降序之间的选择,以及您想要排序,原始 post 中没有提供这些细节,所以这里我假设 sortColumn
是一个字符串,它定义了用户选择的列, sortDescending
是一个标志,指示排序方向是 升序 (false
) 还是 降序 (True
) 顺序。
var query = client.For<MyModel>("MyTable")
.Top(request.PageSize)
.Skip((request.Page - 1) * request.PageSize)
.Filter(filter);
if (sortDescending)
query = query.OrderByDescending(sortColumn);
else
query = query.OrderBy(sortColumn);
var empls = await query.FindEntriesAsync();
还有其他技术可用于实现类似的结果,但是它们的适用性在很大程度上取决于您如何存储要排序的列,是否允许多列排序以及是否允许多列中的不同方向-列排序。
我注意到 Fluent 客户端界面的另一个 OrderBy() 重载:
OrderBy(IEnumerable<KeyValuePair<string, bool>> columns);
如果您需要动态多级排序,您可以创建一个 List> 并用 KeyValuePair 对象填充它,其中 string 是字段规范,bool 是 false对于 ASCENDING 和 true 对于 DESCENDING 排序。
请确保您的字符串使用正斜杠“/”而不是句点作为字段路径分隔符。
排序层次结构将按照您将键值对添加到列表中的顺序排列。所以如果你想排序:
- Person.LastName升序
- Person.FirstName升序
- Person.EmployerName 描述
您只需按上述顺序将对象添加到列表中,正如您期望为布尔值传递 false、false、true。
简单的 OData 如果在编译时知道所有内容,查询就很简单。我已经了解了如何在运行时构建表达式以进行过滤,但我还没有完全弄清楚如何在运行时构建 OrderBy 表达式?
查询模型示例(动态过滤器表达式):
var empls = await client.For<MyModel>("MyTable")
.Top(request.PageSize)
.Skip((request.Page - 1) * request.PageSize)
.Filter(filter)
.FindEntriesAsync();
如果我在编译时知道需要什么顺序,我可以添加一个 .OrderBy() 子句。但是由于用户在运行时决定排序,所以我需要构建一个排序表达式。
为了动态构建上面传递的过滤器,我使用了 ODataExpression<> 对象。我正在寻找传递给订单子句的等效功能(如果存在?)。
无需在单个语句中编写和执行 OData 请求。简单 OData API 旨在让您有选择地构建查询以在您进行时实施您的业务逻辑。
需要知道升序和降序之间的选择,以及您想要排序,原始 post 中没有提供这些细节,所以这里我假设 sortColumn
是一个字符串,它定义了用户选择的列, sortDescending
是一个标志,指示排序方向是 升序 (false
) 还是 降序 (True
) 顺序。
var query = client.For<MyModel>("MyTable")
.Top(request.PageSize)
.Skip((request.Page - 1) * request.PageSize)
.Filter(filter);
if (sortDescending)
query = query.OrderByDescending(sortColumn);
else
query = query.OrderBy(sortColumn);
var empls = await query.FindEntriesAsync();
还有其他技术可用于实现类似的结果,但是它们的适用性在很大程度上取决于您如何存储要排序的列,是否允许多列排序以及是否允许多列中的不同方向-列排序。
我注意到 Fluent 客户端界面的另一个 OrderBy() 重载:
OrderBy(IEnumerable<KeyValuePair<string, bool>> columns);
如果您需要动态多级排序,您可以创建一个 List
请确保您的字符串使用正斜杠“/”而不是句点作为字段路径分隔符。
排序层次结构将按照您将键值对添加到列表中的顺序排列。所以如果你想排序:
- Person.LastName升序
- Person.FirstName升序
- Person.EmployerName 描述
您只需按上述顺序将对象添加到列表中,正如您期望为布尔值传递 false、false、true。