在odatcontroller中添加WebAPI OData $orderby选项
本文关键字:orderby 选项 OData WebAPI odatcontroller 添加 | 更新日期: 2023-09-27 18:01:17
我已经写了一个继承自ODataController
的OData WebAPI控制器。
public class ManyColumnsController : ODataController
{
[Queryable(
AllowedOrderByProperties = "Aa,Bb,Cc,Dd",
EnsureStableOrdering = false,
MaxOrderByNodeCount = 2)]
public IQueryable<ManyColumn> GetManyColumns(
ODataQueryOptions<ManyColumn> options)
{
// Because I've disabled EnsureStableOrdering,
// I need to check column "Dd" is always included
// in the OrderBy option.
if (!options.OrderBy.RawValue.Contains("Dd")
{
// I need to add an OrderByPropertyNode to
// options.OrderBy.OrderByNodes.
}
return this.context.ManyColumns;
}
}
如何实例化OrderByNode
以添加到OrderByQueryOption
公开的泛型集合中?
您将注意到OrderByNode
的一个构造函数接受IEdmProperty
。我觉得我应该有一些琐碎的方法从options.Context.Model
暴露的IEdmModel
中找到IEdmProperty
的实例。和IEdmType
在options.Context.ElementType
。
如果这是可以实现的,我可以使用实例来代替if
语句中的字符串搜索。除了将其添加到整个OrderByClause
.
IEdmEntityType entityType=options.Context.ElementType as Microsoft.OData.Edm.IEdmEntityType;
IEdmStructuralProperty property = entityType.DeclaredStructuralProperties().Single(p => p.Name == "Dd");
IEdmType edmType=property.Type.Definition;
你可以像金夫说的那样得到这个属性,
但是我认为你可以新建一个OrderByQueryOption并调用ApplyTo来满足你的要求。
var result = this.context.ManyColumns;
if (!options.OrderBy.RawValue.Contains("Dd")
{
var orderBy = new OrderByQueryOption("Dd", new ODataQueryContext(Request.GetEdmModel(), typeof(ManyColumn)));
result = orderBy.ApplyTo(result );
}