繁体   English   中英

C#OData4应用OData查询,而控制器不返回Queryable

[英]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有任何其他选择,因为结果一定可以查询。

EnableQueryEnableQuery属性正在执行它装饰的操作,以获取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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM