使用Microsoft Web API的ODATA是否真的是REST体系结构?

c# rest pagination odata

729 观看

1回复

4619 作者的声誉

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

我们将不得不使用强制机制来保留呈现给JavaScript客户端的页码。

还是我不正确理解Microsoft对OData的实现?

编辑1:

ODATA V4是状态架构吗?由Microsoft模式团队推动。我看不到从Asp.Net Web API(REST)迁移到OData(Sounds STATEFUL)体系结构的任何简便方法。

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

作者: Abhijeet 的来源 发布者: 2017 年 9 月 15 日

回应 1


6

46172 作者的声誉

决定

简而言之,MS Odata服务器端实现不是全状态的,可以将其视为REST体系结构。

我们将不得不使用强制机制来保留呈现给JavaScript客户端的页码

您在请求中提供分页信息。例如,如果您想要第2页有10个项目,则可以排在前10名,然后跳过10。

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

如您所见,客户端/呼叫者指定了分页,服务器不需要跟踪客户端的状态。

同样添加$count=true将根据结果集中包含的传入过滤器返回记录总数(在上面的示例中没有过滤器)。这将允许客户端计算页面的数量。


该框架希望所有数据库都直接作为ViewModel公开。

也不是真的。你可以返回一个IQueryable<T>地方T是你喜欢的类型。T不必是EF模型。例如,从a返回以下内容DbContext是可以接受的。

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

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

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

OData的所有选项上都有许多资源。我不会在这里包括所有内容,否则我可能只创建第二套文档。

作者: Igor 发布者: 2017 年 9 月 18 日
32x32