千家信息网

.NET Core开发日志之OData的示例分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要为大家展示了".NET Core开发日志之OData的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下".NET Core开发日志之ODa
千家信息网最后更新 2026年11月02日.NET Core开发日志之OData的示例分析

这篇文章主要为大家展示了".NET Core开发日志之OData的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下".NET Core开发日志之OData的示例分析"这篇文章吧。

简述

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"      }    }  ]}

以上是".NET Core开发日志之OData的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

数据 内容 查询 终结点 模型 日志 示例 分析 开发 高级 地址 文件 方法 篇文章 功能 方式 学习 帮助 服务 必要 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网黑科技 中关村互联网科技集团 工业互联网科技新基建 易互联网科技有限公司 深圳互联网络科技有限公司 有马互联网科技 互联网未来科技 沃里互联网科技 左右互联网络科技 多迪互联网科技有限公司 卓越科技互联网 招聘 农村开互联网科技讲堂 速维有品互联网信息科技(苏州)有限公司 中国科技创新与世界互联网大会 民营互联网公司国防科技 深圳市罗太互联网科技有限公司 上海钢联属于互联网科技股吗 中天科技中国工业互联网 美国互联网科技公司 华人运通互联网科技公司 互联网金融与金融科技 中国互联网科技发展 甘肃拓世互联网科技有限公司 华中科技有哪些互联网大佬 宁夏众和广鑫互联网科技有限公司 崇明区互联网教育科技诚信经营 河南住房之家互联网科技 上海同邻互联网科技有限公司规模 数字科技和互联网金融哪个好 互联网科技创业有什么好项目
0