[英]C# OData4 Apply OData query without controller returning Queryable
我目前有一个使用我们编写的OData版本的C#WebAPI。 我们想开始使用Microsoft的OData4,它比我们的自定义实现还可以做的更多。
创建一个扩展ODataController的控制器我可以创建一个基于查询字符串自动查询的控制器。 (如下所示)
问题是当我希望它返回包含附加数据的Result
对象时,它返回查询的Result
。 当我将返回类型设置为Result时,尽管它将不再应用查询字符串。
如何使用自动可查询的实现并仍然返回自己的对象? 我尝试过创建一个公共方法来返回正确的对象,并调用一个私有方法来返回可查询对象,但是它不能正确过滤可查询对象。
我是在正确的轨道上,还是还有其他选择?
public class CallController : ODataController
{
[EnableQuery]
public IQueryable<Call> GetCall()
{
var list = new List<Call>
{
new Call
{
Id = 4
},
new Call
{
Id = 9
},
new Call
{
Id = 1
}
};
return list.AsQueryable();
}
}
public class Call
{
public int Id { get; set; }
}
public class Result
{
public Call[] Calls { get; set; }
public string NewToken { get; set; }
public string Warning { get; set; }
}
您将需要在onactionexecute中使用动作过滤器属性来拦截响应,并将其转换为所需的值。 不会很漂亮,因为不清楚该方法真正返回的是什么。 但是我看不到odata有任何其他选择,因为结果一定可以查询。
使用ODataQuertOptions代替[EnableQuery]属性。 直接检查https://docs.microsoft.com/zh-cn/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options#invoking-query-options-direct
在EnableQuery
, EnableQuery
属性正在执行它装饰的操作,以获取IQueryable<T>
,将odata查询转换为可以应用于IQueryable<T>
,然后应用它并返回结果。
为了工作,它需要一个IQueryable<T>
。
Ihar的答案中的ODataQueryOptions
和示例可能会为您提供所需的内容,但是由于种种原因,它对我来说不如EnableQuery
有用,所以我最终得到了一个输出格式化程序。
您可以在Startup.ConfigureServices
检查services.AddMvc(options => { options.OutputFormatters }
中的第一个输出格式化程序,并查看第一个输出格式化程序有很多不同的有效负载类型。
我已经能够插入自定义错误处理程序来处理ODataPayloadKind.Error
有效载荷-如果不在开发人员模式下,则重写从服务器返回的内容以删除堆栈跟踪等。 我没有研究过非错误的情况,但是您可能可以使用我在这里的内容作为起点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.