2

我有一个 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 中使用存储库模式,EntityFramework Code First 数据访问位于一个单独的项目中,使用 Ninject 将具体对象分配给接口占位符。也许我可以从数据访问层一直抽象出接口,以便 Repository 对象携带对 IQueryProvider 的引用。您认为这是否可行,并允许它支持自动 oData 集成?

4

1 回答 1

3

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

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

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

于 2013-02-06T03:16:56.903 回答