【问题标题】:C# OData4 Apply OData query without controller returning QueryableC# OData4 应用 OData 查询而不控制器返回 Queryable
【发布时间】:2017-01-06 17:11:02
【问题描述】:

我目前有一个使用我们编写的 OData 版本的 C# WebAPI。我们想开始使用 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; }
}

【问题讨论】:

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


    【解决方案1】:

    【讨论】:

    • 这是一个边界线link-only answer。您应该在此处扩展您的答案以包含尽可能多的信息,并使用该链接仅供参考。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      在后台,EnableQuery 属性正在执行它所修饰的操作以获取 IQueryable&lt;T&gt;,将 odata 查询转换为可应用于 IQueryable&lt;T&gt; 的内容,应用它并返回结果。

      为了工作,它需要一个IQueryable&lt;T&gt;

      ODataQueryOptions 和 Ihar 回答中的示例可能会给你想要的东西,但由于各种原因,它对我来说不如 EnableQuery 有用,所以我最终得到了一个输出格式化程序。

      您可以在Startup.ConfigureServices 中检查services.AddMvc(options =&gt; { options.OutputFormatters } 中的第一个输出格式化程序,并查看第一个输出格式化程序有一堆不同的有效负载类型。

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

      【讨论】:

        猜你喜欢
        • 2013-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-11
        • 2020-10-27
        相关资源
        最近更新 更多