简述

OData,即Open Data Protocol,是由微软在2007年推出的一款开放协议,旨在通过简单、标准的方式创建和使用查询式及交互式RESTful API。

类库

在.NET Core中想要使用OData功能的话需要添加Microsoft.AspNetCore.OData包。

dotnet add package Microsoft.AspNetCore.OData

准备模型类

public class Address

{

public string City { get; set; }

public string Street { get; set; }

}

public enum Category

{

Book,

Magazine,

EBook

}

public class Press

{

public int Id { get; set; }

public string Name { get; set; }

public string Email { get; set; }

public Category Category { get; set; }

}

public class Book

{

public int Id { get; set; }

public string ISBN { get; set; }

public string Title { get; set; }

public string Author { get; set; }

public decimal Price { get; set; }

public Address Address { get; set; }

public Press Press { get; set; }

}

创建Edm模型

OData使用EDM,即Entity Data Model来描述数据的结构。在Startup文件中添加创建方法。

private static IEdmModel GetEdmModel()

{

var builder = new ODataConventionModelBuilder();

builder.EntitySet("Books");

builder.EntitySet("Presses");

return builder.GetEdmModel();

}

注册OData服务

在Startup文件的ConfigureServices方法里注册OData服务。

services.AddOData();

services.AddMvc(options =>

{

options.EnableEndpointRouting = false;

}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

这里要注意的是在.NET Core 2.2里,默认已经有终结点,所以要使用OData的终结点的话需要将默认选项禁用掉。

注册OData终结点

同样在Startup文件里,在其Configure方法内将原来的注册路由内容改为注册OData的终结点。

app.UseMvc(b =>

{

b.MapODataServiceRoute("odata", "odata", GetEdmModel());

});

显示元数据

运行程序后访问https://localhost:5001/odata/$metadata地址,可以看到所有可用模型的元数据。

创建Controller

本文实例中不考虑数据库的操作,故而使用hard code方式构建必要的模型对象。

public class BooksController : ODataController

{

private static IList Books {get; set;}

public BooksController()

{

Books = new List

{

new Book

{

Id = 1,

ISBN = "111-0-321-56789-1",

Title = "Calculus",

Price = 66.6m,

Address = new Address

{

City = "Shanghai",

Street = "Beijin Xi Road"

},

Press = new Press

{

Id = 1,

Name = "Shanghai Tongji",

Category = Category.Book

}

},

new Book

{

Id = 2,

ISBN = "222-2-654-00000-2",

Title = "Linear Algebra",

Price = 53.2m,

Address = new Address

{

City = "Shanghai",

Street = "Beijin Dong Road"

},

Press = new Press

{

Id = 2,

Name = "Shanghai Fudan",

Category = Category.EBook

}

}

};

}

[EnableQuery]

public IActionResult Get()

{

return Ok(Books);

}

[EnableQuery]

public IActionResult Get(int key)

{

return Ok(Books.FirstOrDefault(b => b.Id == key));

}

}

EnableQuery特性在需要高级查询的场景时必须添加。

查询

加入Controller之后,访问https://localhost:5001/odata/Books地址,可得到所有Book数据。

{

"@odata.context": "https://localhost:5001/odata/$metadata#Books",

"value": [

{

"Id": 1,

"ISBN": "111-0-321-56789-1",

"Title": "Calculus",

"Author": null,

"Price": 66.6,

"Address": {

"City": "Shanghai",

"Street": "Beijin Xi Road"

}

},

{

"Id": 2,

"ISBN": "222-2-654-00000-2",

"Title": "Linear Algebra",

"Author": null,

"Price": 53.2,

"Address": {

"City": "Shanghai",

"Street": "Beijin Dong Road"

}

}

]

}

访问https://localhost:5001/odata/Books(1)地址,可得到key值为1的Book数据。

{

"@odata.context": "https://localhost:5001/odata/$metadata#Books/$entity",

"Id": 1,

"ISBN": "111-0-321-56789-1",

"Title": "Calculus",

"Author": null,

"Price": 66.6,

"Address": {

"City": "Shanghai",

"Street": "Beijin Xi Road"

}

}

高级查询

如果想要使用OData查询的高级功能,可以在注册终结点时额外加上相应的配置。

app.UseMvc(b =>

{

b.Select().Expand().Filter().OrderBy().MaxTop(100).Count();

b.MapODataServiceRoute("odata", "odata", GetEdmModel());

});

访问网址时加上所需的查询内容:

https://localhost:5001/odata/Books?$select=Id,Title

{

"@odata.context": "https://localhost:5001/odata/$metadata#Books(Id,Title)",

"value": [

{

"Id": 1,

"Title": "Calculus"

},

{

"Id": 2,

"Title": "Linear Algebra"

}

]

}

如果想要按特定条件过滤数据内容的话也很容易:

https://localhost:5001/odata/Books?$filter=Price%20le%2060

{

"@odata.context": "https://localhost:5001/odata/$metadata#Books",

"value": [

{

"Id": 2,

"ISBN": "222-2-654-00000-2",

"Title": "Linear Algebra",

"Author": null,

"Price": 53.2,

"Address": {

"City": "Shanghai",

"Street": "Beijin Dong Road"

}

}

]

}

总结

不难看出,OData的真正魅力在于其对那些高级查询功能的支持,所以在创建RESTful API时,不妨考虑使用OData,这样应该能减少许多不必要的代码工作。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

您可能感兴趣的文章:详解ASP.NET Core应用中如何记录和查看日志

.Net Core项目如何添加日志功能详解

详解.Net Core中的日志组件(Logging)

详解.Net core2.0日志组件Log4net、Nlog简单性能测试

ASP.NET Core开发教程之Logging利用NLog写日志文件

.NET Core日志配置的方法

Asp.Net Core轻松学之利用日志监视进行服务遥测详解

mysql odata_.NET Core开发日志之OData(Open Data Protocol)相关推荐

  1. .NET Core开发日志——配置

    .NET Core开发日志--配置 原文:.NET Core开发日志--配置 熟悉ASP.NET的开发者一定对web.config文件不陌生.在ASP.NET环境中,要想添加配置参数,一般也都会在此文 ...

  2. .NET Core开发日志——RequestDelegate

    本文主要是对.NET Core开发日志--Middleware的补遗,但是会从看起来平平无奇的RequestDelegate开始叙述,所以以其作为标题,也是合情合理. RequestDelegate是 ...

  3. .NET Core开发日志——WCF Client

    WCF作为.NET Framework3.0就被引入的用于构建面向服务的框架在众多项目中发挥着重大作用.时至今日,虽然已有更新的技术可以替代它,但对于那些既存项目或产品,使用新框架重构的代价未必能找到 ...

  4. .NET Core开发日志——HttpClientFactory

    当需要向某特定URL地址发送HTTP请求并得到相应响应时,通常会用到HttpClient类.该类包含了众多有用的方法,可以满足绝大多数的需求.但是如果对其使用不当时,可能会出现意想不到的事情. 博客园 ...

  5. .NET Core开发日志——从ASP.NET Core Module到KestrelServer

    ASP.NET Core程序现在变得如同控制台(Console)程序一般,同样通过Main方法启动整个应用.而Main方法要做的事情很简单,创建一个WebHostBuilder类,调用其Build方法 ...

  6. .NET Core开发日志——Runtime IDentifier

    .NET Core对于传统.NET开发人员而言是既熟悉又陌生的新平台,所以有时遇上出乎意料的事情也纯属正常情况.这时只需点耐心,多查查资料,努力找到原因,也未尝不是件有意义的体验. 比如当建完一个最简 ...

  7. .NET Core开发日志——OData

    简述 OData,即Open Data Protocol,是由微软在2007年推出的一款开放协议,旨在通过简单.标准的方式创建和使用查询式及交互式RESTful API. 类库 在.NET Core中 ...

  8. .NET Core开发日志——结构化日志

    在.NET生态圈中,最早被广泛使用的日志库可能是派生自Java世界里的Apache log4net.而其后来者,莫过于NLog.Nlog与log4net相比,有一项较显著的优势,它支持结构化日志. 结 ...

  9. .NET Core开发日志——Linux版本的SQL Server

    SQL Server 2017版本已经可以在Linux系统上安装,但我在尝试.NET Core跨平台开发的时候使用的是Mac系统,所以这里记录了在Mac上安装SQL Server的过程. 最新的SQL ...

最新文章

  1. 哈希(Hash)算法是一种单向密码体制(它是一个从明文到密文的不可逆的映射只有加密过程没有解密过程)
  2. Facebook Messenger月用户数不断攀升 突破12亿
  3. 【学术相关】中国霸榜AI顶会,但引用量最低!最新斯坦福AI指数出炉!
  4. ajax jq 图片上传请求头_Jquery ajaxsubmit上传图片实现代码
  5. 中国进口消费市场研究报告2020
  6. GTK的.NET的函数库 GTK#
  7. ubuntu+intellij IDEA+android环境配置
  8. lammps教程:NEMD方法计算热导率公式详解
  9. windows10怎么卸载计算机,win10易升,详细教您如何彻底卸载删除win10易升
  10. 《统计决策论及贝叶斯分析》
  11. AQS框架原文翻译 - The java.util.concurrent Synchronizer Framework
  12. 算法复杂性分析及运算规则证明(一)
  13. 网站被攻击了,接入CDN防护,源IP是否需要修改
  14. 拓商:拼多多客服回复慢,到底应该怎么解决?
  15. nodemcu 自建服务器,NodeMCU入门(4):搭建Web服务器,配置网络连接(示例代码)
  16. linux下open函数用法,linux下open函数和creat函数
  17. Geany文本编辑器
  18. 在线教你如何设计个性好看的POP字体?
  19. VC、C++彩信接口开发经验及具体开发实现
  20. Oracle gsd服务是什么,oracle11gRAC的oc4j和gsd服务都处于offline状态

热门文章

  1. 第十届蓝桥杯省赛JavaB组G_外卖店优先级
  2. 大学有python专业吗-那个选错专业的大学生,后来去干嘛了?
  3. vue中调用百度地图api
  4. 你以为面试官问的是Vue,其实他想问……
  5. c语言,通过for循环计算1+1/2+1/3+……+1/100的值
  6. CET-6 | 2018年 六级真题『翻译』语句
  7. Cisco PT模拟实验(10) 路由器的基本配置
  8. 分享一个免费清理苹果电脑Mac磁盘空间方法
  9. IxEdit傻瓜式JavaScript开发工具(附下载、汉化版、视频教程)
  10. 图书馆管理系统应用程序说明书