在JSON中包装Web API响应,但仍然使用IQueryable和oData

时间:2013-02-06 02:32:11

标签: 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”属性,并设置“total”和“success”属性的值。这会创建消费者正在寻找的JSON响应。但它不再是IQueryable,这意味着我无法实现oData过滤器。

我希望通过设置其枚举器等来获取我的包装器对象并使其实现IQueryable。但是,我认为这不会起作用,因为我必须分配Provider和Expression属性来实现接口,而我不知道我应该把它放在那里。我正在使用IoC的Repository模式,而EntityFramework Code First数据访问是在一个单独的项目中,使用Ninject将具体对象分配给接口占位符。也许我可以从数据访问层一直抽象出接口,以便Repository对象携带对IQueryProvider的引用。你认为这会起作用,并允许它支持自动oData集成吗?

1 个答案:

答案 0 :(得分:3)

这是你如何做到的。在幕后,[Queryable]只创建一个ODataQueryOptions实例,然后将其应用于您返回的可查询对象。好消息是你可以参数绑定ODataQueryOptions并拥有如下所示的代码:

public Wrapper<MyObject> Get(ODataQueryOptions<MyObject> queryOptions)
{
    IQueryable<MyObject> queryResults = queryOptions.ApplyTo(dbSet);
    return Wrap(queryResults);
}

你甚至不再需要[可查询],因为你正在做你本来会做的事情。希望有所帮助。