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

Abh*_*eet 1 c# rest pagination odata

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

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

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

编辑-1:

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

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

Igo*_*gor 6

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

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

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

odata-url/?$count=true&$top=10&$skip=10
Run Code Online (Sandbox Code Playgroud)

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

另外,添加$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
        });
}
Run Code Online (Sandbox Code Playgroud)

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

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

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