c# - 使用Microsoft Web API 的ODATA 真的是REST 架构吗?

标签 c# rest pagination odata

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

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

Or am I not understanding Microsoft implmentation of OData correctly?

编辑-1:

Is ODATA V4 a Stateful Architecture? As promoted by Microsoft patterns team. I do not see any easy path of Migration from Asp.Net Web API (REST) to OData (Sounds STATEFUL) Architecture.

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

最佳答案

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

We would be forced to use stasteful mechanism to persist page numbers rendered to the JavaScript client

您在请求中提供寻呼信息。例如,如果您想要第 2 页的 10 个项目,您将选择前 10 个并跳过 10 个。

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

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

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


The framework expects all the database to be directly exposed as ViewModel...

也不是真的。您可以返回 IQueryable<T>其中 T是你的类型。 T不必是 EF 模型。例如,从 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 的所有选项的资源很多。我不会在此处包含所有内容,否则我还不如创建第二套文档。

关于c# - 使用Microsoft Web API 的ODATA 真的是REST 架构吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46232820/

相关文章:

html - will_paginate 当前页始终为 1

javascript - AngularJS 分页 - 获取当前页面并传递给 Controller

java - Angular $http.get 总是在使用本地 Restful 服务时出现错误

c# - 我的深拷贝不是真正的深拷贝

c# - 为什么用 Func<T,bool> 而不是 Predicate<T>?

c# - 为什么 Url.IsLocalUrl 对于 ASP.NET MVC 中的本地 URL 是假的?

rest - 如何将 HashSet 传递到服务器以测试 postman 的 API?

rest - 404邮件上的邮件正文

html - 在可打印文档的 <thead> 上使用 CSS 添加总页数指示器?

c# - 选择进入解释/临时表