什么是Odata?
OData,全称Open Data Protocol,是由微软在2007年推出的一款开放协议,旨在通过简单、标准的方式创建和使用查询式及交互式RESTful API。通过OData协议可以有效减少开发人员的工作量。.
使用环境
新建一个ASP.NET Core Mvc项目,最好.NET Core 3.1以上版本,3.1之下的版本微软已不受支持。在项目里添加“Microsoft.AspNetCore.OData”包或者用如下命令添加。
dotnet add package Microsoft.AspNetCore.OData准备模型
OData是基于模型的,这里我们用简单的一个模型来模拟。
public class Dog{public int Id { get; set; }public string Name { get; set; }public string Color { get; set; }}
创建Edm模型
OData使用EDM,类似Entity Data Model来描述数据的结构。新建一个在ModelBuilder类,在文件中添加创建GetEdmModel方法。
public static class ModelBuilder{public static IEdmModel GetEdmModel(){var odataBuilder = new ODataConventionModelBuilder();odataBuilder.EntitySet<Dog>("Dog");return odataBuilder.GetEdmModel();}}
注册和注入OData服务
在Startup文件的ConfigureServices方法里注册OData服务。
public void ConfigureServices(IServiceCollection services){services.AddControllers();services.AddOData();//注册OData服务}
在Startup文件的Configure方法里的路由终结点注入OData服务。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env){app.UseEndpoints(endpoints =>{endpoints.MapControllers();//开放的查询条件 允许执行Select、过滤、排序、统计,最大展示10条endpoints.Select().Filter().OrderBy().Count().MaxTop(10);//注入endpoints.MapODataRoute("odata", "odata",ModelBuilder.GetEdmModel());});}
浏览元数据
启动项目后可以浏览元数据(/odata/$metadata),如下这个我本地的站点地址http://localhost:21336/odata/$metadata,这里面列出了所映射的实体,效果如下:

如显示如上图所示,证明配置安装成功
在Controller里使用
我们创建一个Controller模拟几个接口,模拟几条数据,这里就不直接链接数据库了。Controller需要继承ODataController类,这下面是几种请求方法。
[Route("api/[controller]")][ApiController]public class DogController : ODataController{//模拟数据public static IList<Dog> Dogs = new List<Dog>{new Dog {Id = 1, Name = "花花", Color = "black"},new Dog {Id = 2, Name = "金毛", Color = "yellow"},new Dog {Id = 3, Name = "小灰灰", Color = "gray"},new Dog {Id = 4, Name = "卡卡", Color = "gray"},};//使用OData需要加上 EnableQuery[HttpGet, EnableQuery]public ActionResult Get(){return Ok(Dogs);}[HttpGet, EnableQuery]public IActionResult Get([FromODataUri]int key){return Ok(Dogs.FirstOrDefault(b => b.Id == key));}//创建[HttpPost]public IActionResult Post(Dog person){Dogs.Add(person);return Created(person);}//修改[HttpPatch]public IActionResult Patch([FromODataUri] int key, Delta<Dog> person){var updateDog = Dogs.FirstOrDefault(p => p.Id == key);if (updateDog == null) return NotFound();person.Patch(updateDog);return Updated(updateDog);}//删除[HttpDelete]public IActionResult Delete([FromODataUri] int key){var deleteDog = Dogs.FirstOrDefault(p => p.Id == key);if (deleteDog == null) return NotFound();Dogs.Remove(deleteDog);return StatusCode(204);}}
查询展示
1、简单查询
我们用postman测试查询,先来查询全部,输入实体名称就可以查询全部

访问id为1的数据

2、更高级的查询
需要在开始终结点设置,前面已经设置。
endpoints.Select().Filter().OrderBy().Count().MaxTop(10);//这个意思是可以在查询使用Select、过滤、排序、统计,最大展示10条
比如只查询两条数据

过滤查询,比如查询id为3的数据

过滤条件有

结语
本文讲述了OData服务在ASP.NET Core的简单使用,同时通过一些案例介绍OData常用的一些操作。遇到的坑是版本需要跟.NET Cor对应,否则会报版本不对应的问题。篇幅有限更多OData相关的信息可以访问www.odata.org。