ODATA是否真的使用Microsoft Web API REST架构?

我越是研究ODATA上的Microsoft框架,我倾向于认为它不适合企业应用程序。 该框架期望所有数据库直接作为ViewModel公开,即使对于像分页和排序这样的简单操作也是如此。

我们将被迫使用强大的机制来保存呈现给JavaScript客户端的页码。

或者我不正确理解微软对OData的影响?

编辑-1:

ODATA V4是一个有状态架构吗? 由微软模式团队推动。 我没有看到从Asp.Net Web API(REST)迁移到OData(Sounds STATEFUL)架构的任何简单路径。

编辑-2:分页,排序和分组是来自客户端的传入请求的一部分。

简而言之,MS Odata服务器端实现不是有状态的,它可以被认为是REST架构。

我们将被迫使用强大的机制来保存呈现给JavaScript客户端的页码

您在请求中提供分页信息。 例如,如果您想要第2页的10个项目,您将获得前10名并跳过10。

odata-url/?$count=true&$top=10&$skip=10 

如您所见,客户端/调用者指定了分页,服务器无需跟踪客户端的状态。

另外,添加$count=true将返回基于结果集中包含的传入filter的记录总数(在上面的示例中没有filter)。 这将允许客户端计算有的页数。


该框架期望所有数据库直接作为ViewModel公开…

也不是真的。 您可以返回IQueryable ,其中T是您的类型。 T不一定是EF模型。 例如,从DbContext返回以下DbContext是可以接受的。

 public IQueryable Get() { return dbContext.SomeEntities .Where(x => optionalPreFiltereExpression) .Select(x => new SomeDTO(){ Prop1 = x.Prop1, Collection1 = x.CollectionOfInterest, // etc }); } 

为了进一步说明这一点,您还可以返回一个硬编码的对象列表,尽管这可能不太可能在生产中。

 public IQueryable Get() { return new List(){ new SomeDTO(){ Prop1 = 5, Prop2 = "Hi there" // etc}, new SomeDTO(){ Prop1 = 6, Prop2 = "Goodbye" // etc} }).AsQueryable(); } 

OData的所有选项都有很多资源。 我不会在这里包含所有内容,否则我不妨创建第二套文档。

  • 支持ASP.NET Web API中的OData查询选项
  • odata.org – 入门
  • 使用ASP.NET Web API 2.2创建OData v4端点
  • odata.org – OData版本4.0。 第1部分