在ODataController中添加一个WebAPI OData $ orderby选项

时间:2014-05-02 16:39:01

标签: c# asp.net-web-api odata asp.net-web-api2

我已经从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 IEdmModeloptions.Context.Model. IEdmType处的options.Context.ElementType找到{{3}}的实例。

如果这是可以实现的,我可以在if语句中使用实例代替字符串搜索。除了将其添加到整个OrderByClause

2 个答案:

答案 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 );
}