用JSON包装Web API响应,但仍能与IQueryable和oData一起使用

用JSON包装Web API响应,但仍能与IQueryable和oData一起使用,json,asp.net-web-api,odata,iqueryable,Json,Asp.net Web Api,Odata,Iqueryable,我有一个ASP.NET Web API项目,我想在该项目中使用oData过滤器,以及ASP.NET oData预览包。这意味着我需要使用IQueryable作为响应类型 不幸的是,使用者需要这样包装响应: { "total": 2, "success": true, "data": [ { object1 }, { object2 } ] } 我创建了一个包装器对象,它将原始版本的IQueryable响应分配给“data”属性,并

我有一个ASP.NET Web API项目,我想在该项目中使用oData过滤器,以及ASP.NET oData预览包。这意味着我需要使用
IQueryable
作为响应类型

不幸的是,使用者需要这样包装响应:

{
   "total": 2,
   "success": true,
   "data": [ 
           { object1 },
           { object2 } ]
}
我创建了一个包装器对象,它将原始版本的
IQueryable
响应分配给“data”属性,并设置“total”和“success”属性的值。这将创建使用者正在寻找的JSON响应。但它不再是IQueryable,这意味着我无法实现oData过滤器


我希望使用我的包装器对象,并通过设置其枚举数等使其实现IQueryable。但是,我认为这不会起作用,因为我必须分配提供程序和表达式属性来实现接口,我不知道应该在那里放置什么。我在IoC中使用存储库模式,EntityFramework Code First数据访问在一个单独的项目中,使用Ninject将具体对象分配给接口占位符。也许我可以从数据访问层一路抽象出接口,以便存储库对象携带对IQueryProvider的引用。您认为这是否可行,并允许它支持自动化oData集成?

以下是您的做法。在幕后,[Queryable]只创建ODataQueryOptions的实例,然后将其应用于返回的Queryable。好消息是,您可以使用参数绑定ODataQueryOptions并获得如下代码:

public Wrapper<MyObject> Get(ODataQueryOptions<MyObject> queryOptions)
{
    IQueryable<MyObject> queryResults = queryOptions.ApplyTo(dbSet);
    return Wrap(queryResults);
}
公共包装器获取(ODataQueryOptions查询选项)
{
IQueryable queryResults=查询选项.ApplyTo(dbSet);
返回包装(查询结果);
}

你甚至不再需要[Queryable],因为你正在做它本可以为你做的事情。希望能有帮助。

哇,谢谢。这比我要尝试的要容易得多:设置似乎可以实现这一点,但是,当通过
queryOptions.ApplyTo(repoResult)
应用过滤器时,它实际上不会改变结果。我是否必须将选项一直保留到实体框架dbSet?或者我不能将其应用于从存储库类返回的任何IQueryable结果吗?ApplyTo不会更改您传入的IQueryable。它只返回带有查询结果的IQueryable。你能澄清一下你的意思吗?我知道这是一篇老文章,但我正在尝试这样做,我仍然得到EntitySet json响应。我需要在响应中获得“success”属性。我使用的是ODataV4