我已经从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
。我觉得应该有一些简单的方法可以从IEdmProperty
IEdmModel
和options.Context.Model
. IEdmType
处的options.Context.ElementType
找到{{3}}的实例。
如果这是可以实现的,我可以在if
语句中使用实例代替字符串搜索。除了将其添加到整个OrderByClause
。
答案 0 :(得分:2)
IEdmEntityType entityType=options.Context.ElementType as Microsoft.OData.Edm.IEdmEntityType;
IEdmStructuralProperty property = entityType.DeclaredStructuralProperties().Single(p => p.Name == "Dd");
IEdmType edmType=property.Type.Definition;
答案 1 :(得分:1)
你可以像金福所说的那样获得财产,
但我认为你可以新建一个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 );
}