gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:29:54 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com