我目前有一个C#WebAPI,它使用我们编写的OData版本。我们想要开始使用Microsoft的OData4,它可以比我们的自定义实现更多。
创建扩展ODataController的控制器我可以创建一个控制器,根据查询字符串自动查询。 (如下所示)
问题是,当我希望它返回包含附加数据的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; }
}
答案 0 :(得分:1)
您需要在onactionexecuted中使用动作过滤器属性拦截响应,并将值转换为您想要的任何值。它不会很漂亮,因为不清楚该方法真正归还的是什么。但是我没有看到odata的任何其他选项,因为结果必须是可以的。
答案 1 :(得分:0)
使用ODataQuertOptions代替[EnableQuery]属性。选中https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options#invoking-query-options-directly
答案 2 :(得分:0)
在幕后,EnableQuery
属性正在执行它装饰的操作以获得IQueryable<T>
,将odata查询转换为可以应用于IQueryable<T>
的内容,然后应用返回结果。
要运行,它需要一个IQueryable<T>
。
Ihar的答案中的ODataQueryOptions
和示例可能会为您提供所需的内容,但是由于种种原因,它对我没有EnableQuery
有用,所以我最终得到了输出格式化程序。 / p>
您可以检查services.AddMvc(options => { options.OutputFormatters }
中Startup.ConfigureServices
中的第一个输出格式化程序,并发现第一个输出格式化程序具有许多不同的有效负载类型。
我已经能够插入自定义错误处理程序来处理ODataPayloadKind.Error
负载-如果不在开发人员模式下,则重写服务器返回的内容以除去堆栈跟踪等。我没有研究过非错误的情况,但是您可能可以使用我的here作为起点。