C#OData4应用OData查询,无需控制器返回Queryable

时间:2017-01-06 17:11:03

标签: c# asp.net-web-api asp.net-web-api2 odata odata4j

我目前有一个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; }
}

3 个答案:

答案 0 :(得分:1)

您需要在onactionexecuted中使用动作过滤器属性拦截响应,并将值转换为您想要的任何值。它不会很漂亮,因为不清楚该方法真正归还的是什么。但是我没有看到odata的任何其他选项,因为结果必须是可以的。

答案 1 :(得分:0)

答案 2 :(得分:0)

在幕后,EnableQuery属性正在执行它装饰的操作以获得IQueryable<T>,将odata查询转换为可以应用于IQueryable<T>的内容,然后应用返回结果。

要运行,它需要一个IQueryable<T>

Ihar的答案中的ODataQueryOptions和示例可能会为您提供所需的内容,但是由于种种原因,它对我没有EnableQuery有用,所以我最终得到了输出格式化程序。 / p>

您可以检查services.AddMvc(options => { options.OutputFormatters }Startup.ConfigureServices中的第一个输出格式化程序,并发现第一个输出格式化程序具有许多不同的有效负载类型。

我已经能够插入自定义错误处理程序来处理ODataPayloadKind.Error负载-如果不在开发人员模式下,则重写服务器返回的内容以除去堆栈跟踪等。我没有研究过非错误的情况,但是您可能可以使用我的here作为起点。