在现有Web API中支持ODataQueryOptions

awj*_*awj 7 c# odata asp.net-web-api

我有一个Web API项目已经使用了几年没有OData支持,只有标准的URL参数.

我现在希望为此API添加OData支持,但由于API不是基于可查询模型构建的,因此目的是接收ODataQueryOptions<T>对象并将其传递给存储库.

我能找到的关于支持OData的所有内容都假定我有一个可查询的模型或过于简单化,只是告诉我如何理解ODataQueryOptions对象.因此,我无法启动并运行简单的方法.

这就是我现在拥有的.

[Route("test")]
[HttpGet]
[EnableQuery]
public IHttpActionResult Test(ODataQueryOptions<TestOptions> options)
{
    var settings = new ODataValidationSettings {
            AllowedFunctions = AllowedFunctions.None,
            AllowedLogicalOperators = AllowedLogicalOperators.Equal,
            AllowedArithmeticOperators = AllowedArithmeticOperators.None,
            AllowedQueryOptions = AllowedQueryOptions.Filter
        };
    try
    {
        options.Validate(settings);
    }
    catch (ODataException exception)
    {
        return BadRequest(exception.Message);
    }

    var binaryOperator = options.Filter?.FilterClause?.Expression as BinaryOperatorNode;
    if (binaryOperator != null)
    {
        var property = binaryOperator.Left as SingleValuePropertyAccessNode ?? binaryOperator.Right as SingleValuePropertyAccessNode;
        var constant = binaryOperator.Left as ConstantNode ?? binaryOperator.Right as ConstantNode;

        if (property?.Property != null && constant?.Value != null)
        {
            ;
        }
    }

    return Ok();
}
Run Code Online (Sandbox Code Playgroud)

TestOptions类(在ODataQueryOptions<TestOptions>PARAM)目前是一个空类:

public class TestOptions
{
}
Run Code Online (Sandbox Code Playgroud)

我还补充道

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // existing code

        config.AddODataQueryFilter();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,从REST API客户端调用它...

{
"Message":"发生错误.",
"ExceptionMessage":" 没有注册非OData HTTP路由. ",
"ExceptionType":"System.InvalidOperationException",
"StackTrace":"..."
}

我错过了什么?我原本以为我可能必须在global.asax或类似的方法中注册启用OData的方法,但异常意味着问题在于非OData方法,但所有其他方法仍然按预期返回(,没有任何方法) OData参与).

Rem*_*emy 5

实际上,这在没有EntityDate或任何其他模型设置的情况下都可以完美运行。您只需要一个List<Poco.Language>可以使用.AsQueryable()进行转换的代码就可以了。

[Route(""), HttpGet]
public IHttpActionResult  Get(ODataQueryOptions<Poco.Language> queryOptions)
{          
    return Ok(queryOptions.ApplyTo(_repository.GetAll().AsQueryable()));
}
Run Code Online (Sandbox Code Playgroud)

可以使用所有类型的OData查询选项,正常路由以及WebApiConfig中没有设置的方式调用以上控制器。

Poco.Language 只是一个普通的C#POCO类。