我有一个 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 属性来实现接口(interface),并且我不知道我应该放什么。我使用带有 IoC 的存储库模式,EntityFramework Code First 数据访问位于单独的项目中,并使用 Ninject 将具体对象分配给接口(interface)占位符。也许我可以从数据访问层中一直抽象出接口(interface),以便 Repository 对象携带对 IQueryProvider 的引用。您认为这可行吗?并允许它支持自动化的 oData 集成吗?
最佳答案
具体操作方法如下。在幕后,[Queryable] 只是创建 ODataQueryOptions 的实例,然后将其应用于您返回的可查询。好消息是您可以参数绑定(bind) ODataQueryOptions 并具有如下所示的代码:
public Wrapper<MyObject> Get(ODataQueryOptions<MyObject> queryOptions)
{
IQueryable<MyObject> queryResults = queryOptions.ApplyTo(dbSet);
return Wrap(queryResults);
}
您甚至不再需要 [Queryable],因为您正在做它本来可以为您做的事情。希望有帮助。
关于json - 将 Web API 响应封装在 JSON 中,但仍可与 IQueryable 和 oData 配合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14720641/