c# - 在现有 Web API 中支持 ODataQueryOptions

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

我有一个 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();
}

TestOptions类(在 ODataQueryOptions<TestOptions> 参数中)目前是一个空类:

public class TestOptions
{
}

我也添加了

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

        config.AddODataQueryFilter();
    }
}

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

{
"Message": "An error has occurred.",
"ExceptionMessage": "No non-OData HTTP route registered.",
"ExceptionType": "System.InvalidOperationException",
"StackTrace": " ... "
}

我错过了什么?我原以为我可能必须在 global.asax 或类似文件中注册支持 OData 的方法,但异常暗示问题出在非 OData 方法上,但所有其他方法仍按预期返回(,没有任何 OData 参与)。

最佳答案

实际上,这在没有 EntityDate 或任何其他模型设置的情况下工作得很好。你只需要一个 List<Poco.Language>您可以使用 .AsQueryable() 进行转换然后开始吧。

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

可以使用所有类型的 OData 查询选项、正常路由调用上述 Controller ,无需在 WebApiConfig 中进行设置。

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

关于c# - 在现有 Web API 中支持 ODataQueryOptions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44887086/

相关文章:

c# - 我可以使用什么来实现 C#/.NET 的高质量代码覆盖?

c# - 比较大量对象

c# - HttpClient 从不在 IIS 上发送请求

c# - 使用 Moq 模拟 OData 客户端的容器

c# - WPF 自定义文本框使用 Regex 控制用户输入

c# - Caliburn.微单元测试

asp.net-web-api - 使用 webapi 下载文件

c# - PreRegistrationHandler 没有因任务错误代码而失败

javascript - 如何使用 Html/Javascript 使用 OData 服务?

c# - 从 Windows Azure 存储检索数据