json - 将 Web API 响应封装在 JSON 中,但仍可与 IQueryable 和 oData 配合使用

标签 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 属性来实现接口(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/

相关文章:

java - httpUrlConnextion.getContentLength 返回不正确的值

python - 从 API 访问 JSON 数据

javascript - 数组对象未定义时不显示在 div 中

c# - Asp.Net Web API ODATA 的 GROUP BY/不区分大小写扩展?

javascript - 无需 AJAX 即可搜索 JSON 数据

c# - 安装 CORS 时出现 TypeInitializationException

c# - 使用 EF 数据库优先应用程序部署 ASP.NET Web API

rest - 如何使用 System.Web.Http.OData.Delta 修补枚举?

javascript - 如何让 AngularJS 和 KendoUI 协调工作?

c# - 如何使用 .NET 解析此第 3 方 JSON 服务?