千家信息网

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

发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,这篇文章主要为大家展示了".NET Core开发日志之OData的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下".NET Core开发日志之ODa
千家信息网最后更新 2025年11月09日.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安全错误 数据库的锁怎样保障安全 查询是从数据库的表中筛选 数据库表数据自动排序 网络安全运营人员的优秀事迹 华为手机户外无法联接服务器 网络安全等级保护测评书资质 学习软件开发技术哪个好 程序更新时更新数据库 视频管理服务器和nvr的区别 php面向对象数据库 网络技术所有变化 深圳华强软件开发有限公司 gm工具如何连接数据库 贵州省网络安全现状分析 海南服务好的服务器租用云空间 长json字符串存数据库 云南服务器机柜直销价格 手机简笔画网络安全手抄报 深圳工业软件开发大概要多少钱 玄元剑仙九游多久开一个服务器 武汉华投兴邦网络技术有限公司 谭建炜软件开发 中国联通网络安全工程师岗 服务器虚拟化增强管理性 es浏览器服务器 互联网全球服务器在哪里 应用软件开发的趋势是采用 软件开发框架选择 有关党的网络安全主题 网络安全周线下活动策划 软件开发培训班包就业
0