OData服务通过Web服务来揭发所提供的能源,只要正确利用相关的情商

一.什么是OData OData是叁个盛开的数量合同(Open Data Protocol)
在ASP.NET Web API中,
对此CRUD(create, read, update, and
delete)应用比守旧WebAPI增加了十分的大的油滑
若果科学运用有关的研讨,能够在平等意况下
对几个CRUD应用能够节约相当多支出时间,进而升高耗费功用

OData简介

聊起 WCF Data Service ,不得不说的是 OData。对于二个典型的 Web
服务,它往往会提供了一些功效,比如说:订货、退货那个,然后使用者通过HTTP协议来利用那一个意义。那是面向服务的主旨理维,不过前边服务有一部分败笔,相当多时候,没办法准确预测到顾客要求什么样。因而老是要不断地增添新的接口,不断地修改重临的目的。

另一种方法是所谓的能源为导向的架构(ROA),揭穿Web服务的财富,而且客商能够对各个对财富实行实时的询问,具有表现多少和构成数据的力量。类似于采用SQL 在数据库中查询数据。独一的差别是,ROA你通过U路虎极光L创建查询。

OData是一个商量,规定公开数量的Web服务的特征。上面这段话是OData的概念

Open Data Protocol
(开放数据公约,OData)是用来查询和立异数据的一种Web合同,其提供了把存在于应用程序中的数据暴流露来的点子。OData运用且创设于广大
Web技巧之上,譬如HTTP、Atom Publishing
Protocol(AtomPub)和JSON,提供了从各类应用程序、服务和存款和储蓄库中访问新闻的才干。OData被用来从各类数据源中爆出和访谈音讯,
那么些数据源满含但不压制:关周密据库、文件系统、内容管理体系和价值观Web站点。

二.怎么搭建

OData议和概述

正如上边所波及的,OData服务通过Web服务来表露所提供的财富。然后你能够通过U普拉多L访问那个财富。
OData
合同指明了什么样通过HTTP来查询数据。基本标准是,你可以输入某个带参数的 U揽胜极光L
来对资源拓宽查询。

上边是部分你能够运用的 OData 公共服务,越来越多能够行使的 OData
服务,你能够透过拜见 OData 的官方网址来获得。

在介绍使用 OData 协议进行查询时,将会选取那么些公开的 OData
服务。下边以 http://services.odata.org/Northwind/Northwind.svc/

  为例,在浏览器中输入刚网站,你将会看出

澳门永利娱乐总站 1

从上海体育场合中你能够见见该服务提供了
Products、Advertisements、Categories、Suppliers
那么些能源。通过输入上面这个 U宝马X5L 就能够对那些能源开展访谈。比方:

这一个查询,将会重临该财富的有所基于 XML-Atom 格式的数据。比如下图是
Products 的数量。

澳门永利娱乐总站 2

做一个简单的订单查询示例
我们采取Code First模式创设七个实体对象Product(产品),Supplier(承包商)
1.新建一个ASP.NET Empty项目,采用上利用Web API,如下图
澳门永利娱乐总站 3
2.使用NuGet引用OData和EntityFramework程序集
澳门永利娱乐总站 4
3.在Models文件夹中追加Product(产品),Supplier(代理商)七个实体

格式输出的数目

暗中同意的格式是 XML-Atom,当然,你也足以另外格式,当前还援救 JSON
格式。只要在U昂CoraL上加多 $format=json 参数,就可以获取 json 格式的数量。

澳门永利娱乐总站 5

public class Product    {        public int Id { get; set; }        public string Name { get; set; }        public decimal Price { get; set; }        public string Category { get; set; }        [ForeignKey("Supplier")]        public int? SupplierId { get; set; }        public virtual Supplier Supplier { get; set; }    }public class Supplier    {        public int Id { get; set; }        public string Name { get; set; }        public ICollection<Product> Products { get; set; }    }

分选字段  

默许意况下,是会回来全部字段的,但广大时候,你或然只是索要获得别的的一些字段。比如上面包车型客车询问中只回去
ID 和 Name 字段。

澳门永利娱乐总站 6

4.扩展ProductContext数据库上下文对象,并且在web.config中安排好ConnectionString

展开

相当多时候,大家还索要将波及的导航属性抽取来。展开上边的URubiconL:http://services.odata.org/Northwind/Northwind.svc/$metadata

从上边那几个图能够看看,Product 还也有 Category、Order_Details、Supplier
多少个导航属性。

澳门永利娱乐总站 7

由此 expand 参数,能够把有关的领航属性的多少一并抽取。输入
http://services.odata.org/Northwind/Northwind.svc/Products?$format=json&$expand=Supplier

澳门永利娱乐总站 8

理当如此,你也足以贰次进行多少个导航属性,七个导航属性之间接选举择“,”分隔,举个例子:

ttp://services.odata.org/Northwind/Northwind.svc/Products?$format=json&$expand=Supplier,Category

public class ProductContext : DbContext    {        public ProductContext()            : base("Demo")        { }        public DbSet<Product> Products { get; set; }        public DbSet<Supplier> Suppliers { get; set; }    }

分页

通过 $top 和 $skip 参数,能够进行分页展现,例如:

http://services.odata.org/Northwind/Northwind.svc/Products?$format=json&$skip=10&$take=10

 

过滤

选择 $filter参数,能够对数据开展过滤,比方:

http://services.odata.org/Northwind/Northwind.svc/Products?$format=json&ProductId
gt 4

<connectionStrings>        <add name="Demo" connectionString="Data Source=(localdb)\v11.0;         Initial Catalog=Demo; Integrated Security=True; MultipleActiveResultSets=True;         AttachDbFilename=|DataDirectory|Demo.mdf"      providerName="System.Data.SqlClient" />    </connectionStrings>

排序

澳门永利娱乐总站,行使 $orderby 参数,能够对数码实行排序,譬喻:

http://services.odata.org/Northwind/Northwind.svc/Products?$format=json&$orderby=Product 

升序

http://services.odata.org/Northwind/Northwind.svc/Products?$format=json&$orderby=Product
asc

降序

http://services.odata.org/Northwind/Northwind.svc/Products?$format=json&$orderby=Product
desc

5.生成数据库
小编们运营程序包管控台,运行如下3个指令,
把大家Code First生成的实业生成到数据库
PM> Enable-Migrations
PM> Add-Migration FirstInit
PM> Update-Database
然后大家能够在服务器能源管理器中看出我们转移的数目库表,如下图
澳门永利娱乐总站 9澳门永利娱乐总站 10
6.接下来大家在WebApiConfig中登记大家的OData路由

using Demo2.Models;using System.Web.OData.Builder;using System.Web.OData.Extensions;namespace Demo2{    public static class WebApiConfig    {        public static void Register(HttpConfiguration config)        {            ODataModelBuilder builder = new ODataConventionModelBuilder();            builder.EntitySet<Product>("Products");            builder.EntitySet<Supplier>("Suppliers");            config.MapODataServiceRoute("ODataRoute", null, builder.GetEdmModel());        }    }}

7.接下来大家独家为Product和Supplier新建ODataController,
澳门永利娱乐总站 11
澳门永利娱乐总站 12
我们在上海教室中我们挑选好模型类和多少上下文,
并再度上面两步为Supplier实体也调换对应的ODataController
注意:由于VS2011的OData模板中OData V3版本的沙盘,
引用的称号空间要从V3
using System.Web.Http;
using System.Web.Http.ModelBinding;
using System.Web.Http.OData;
using System.Web.Http.OData.Routing;
修改为V4
using System.Web.Http;
using System.Web.OData;

到此,大家的OData示例程序已经搭建落成,大家在浏览器里展开那么些类型的时候
会产出如下

{  "@odata.context":"http://localhost:8914/$metadata","value":[    {      "name":"Products","kind":"EntitySet","url":"Products"    },{      "name":"Suppliers","kind":"EntitySet","url":"Suppliers"    }  ]}

意味着早就搭建成功了

三.怎么利用 是因为尚未测验数据,大家早先先在数量库表里为Products和Suppliers扩大一些测量试验数据
澳门永利娱乐总站 13
澳门永利娱乐总站 14
接下去大家看看一些简便的施用示例
在自动生成的ProductsController和SuppliersController中
一度为我们转移了之类一些Action
澳门永利娱乐总站 15澳门永利娱乐总站 16
之所以对于有个别充实,修改,删除,更新自个儿就不做过多示例,
那么些都是和WebAPI未有啥太多分歧,
自家根本示例的是询问的选拔,不得不说OData已经为大家把询问成效全做完了
演示1:列出全体Product
URL:http://localhost:8914/Products

{

"@odata.context":"http://localhost:8914/$metadata#Products","value":[

{

"Id":1,"Name":"Products1","Price":100.00,"Category":"Test","SupplierId":1

},{

"Id":2,"Name":"Products2","Price":200.00,"Category":"Test","SupplierId":1

},{

"Id":3,"Name":"Products3","Price":300.00,"Category":"Test","SupplierId":1

},{

"Id":4,"Name":"Products4","Price":400.00,"Category":"P1","SupplierId":2

},{

"Id":5,"Name":"Products5","Price":500.00,"Category":"P1","SupplierId":2

},{

"Id":6,"Name":"Products6","Price":600.00,"Category":"P1","SupplierId":2

},{

"Id":7,"Name":"Products7","Price":700.00,"Category":"P1","SupplierId":2

},{

"Id":8,"Name":"Products8","Price":800.00,"Category":"Test","SupplierId":3

},{

"Id":9,"Name":"Products9","Price":900.00,"Category":"P1","SupplierId":3

}

]

}

示例2,查询单个Products
URL:http://localhost:8914/Products(1) 其中(1)为Id

{  "@odata.context":"http://localhost:8914/$metadata#Products/$entity","Id":1,"Name":"Products1","Price":100.00,"Category":"Test","SupplierId":1}

示例3,查询Products,只列出Name,Price例
URL:http://localhost:8914/Products?$select=Name,Price

{  "@odata.context":"http://localhost:8914/$metadata#Products(Name,Price)","value":[    {      "Name":"Products1","Price":100.00    },{      "Name":"Products2","Price":200.00    },{      "Name":"Products3","Price":300.00    },{      "Name":"Products4","Price":400.00    },{      "Name":"Products5","Price":500.00    },{      "Name":"Products6","Price":600.00    },{      "Name":"Products7","Price":700.00    },{      "Name":"Products8","Price":800.00    },{      "Name":"Products9","Price":900.00    }  ]}

示范5:只列出ID为1的Products,只显示列Name,Price

URL:http://localhost:8914/Products(1)?$select=Name,Price

{  "@odata.context":"http://localhost:8914/$metadata#Products(Name,Price)/$entity","Name":"Products1","Price":100.00}

示例6:列出Products(只有列Name,Price),包括Supplier
URL:http://localhost:8914/Products?$select=Name,Price&$expand=Supplier

{  "@odata.context":"http://localhost:8914/$metadata#Products(Name,Price,Supplier)","value":[    {      "Name":"Products1","Price":100.00,"Supplier":{        "Id":1,"Name":"Supplier1"      }    },{      "Name":"Products2","Price":200.00,"Supplier":{        "Id":1,"Name":"Supplier1"      }    },{      "Name":"Products3","Price":300.00,"Supplier":{        "Id":1,"Name":"Supplier1"      }    },{      "Name":"Products4","Price":400.00,"Supplier":{        "Id":2,"Name":"Supplier2"      }    },{      "Name":"Products5","Price":500.00,"Supplier":{        "Id":2,"Name":"Supplier2"      }    },{      "Name":"Products6","Price":600.00,"Supplier":{        "Id":2,"Name":"Supplier2"      }    },{      "Name":"Products7","Price":700.00,"Supplier":{        "Id":2,"Name":"Supplier2"      }    },{      "Name":"Products8","Price":800.00,"Supplier":{        "Id":3,"Name":"Supplier3"      }    },{      "Name":"Products9","Price":900.00,"Supplier":{        "Id":3,"Name":"Supplier3"      }    }  ]}

示例7:过滤Products,只显示分类为Test的数据
URL:http://localhost:8914/Products?$filter=Category eq ’Test‘

{  "@odata.context":"http://localhost:8914/$metadata#Products","value":[    {      "Id":1,"Name":"Products1","Price":100.00,"Category":"Test","SupplierId":1    },{      "Id":2,"Name":"Products2","Price":200.00,"Category":"Test","SupplierId":1    },{      "Id":3,"Name":"Products3","Price":300.00,"Category":"Test","SupplierId":1    },{      "Id":8,"Name":"Products8","Price":800.00,"Category":"Test","SupplierId":3    }  ]}

示例8:过滤Products,只呈现分类为Test的数码,并排序
URL:http://localhost:8914/Products?$filter=Category eq
’Test‘&$orderby=Price desc

{  "@odata.context":"http://localhost:8914/$metadata#Products","value":[    {      "Id":8,"Name":"Products8","Price":800.00,"Category":"Test","SupplierId":3    },{      "Id":3,"Name":"Products3","Price":300.00,"Category":"Test","SupplierId":1    },{      "Id":2,"Name":"Products2","Price":200.00,"Category":"Test","SupplierId":1    },{      "Id":1,"Name":"Products1","Price":100.00,"Category":"Test","SupplierId":1    }  ]}

上面是$filter的别样的采纳方法
1.  http://localhost/Products?$filter=Category eq ‘Test’
过滤Category=Test
2.http://localhost/Products?$filter=Price lt 10
过滤Price小于10
3。http://localhost/Products?$filter=Price ge 5 and Price le 15
过滤5<=Price>=15
5,还足以动用数据库函数如:
$filter=substringof(‘zz’,Name)
$filter=year(ReleaseDate) gt 2005

有关排序
$orderby=Price
$orderby=Price desc
$orderby=Category,Price desc

再有局地过滤器如
$skip,$top,$inlinecount等等
于是OData基本上达成我们们想要查询的连锁方法
对于CUEvoqueD程序的查询来讲大大进步开辟效能

四: 相关援用财富
https://www.asp.net/web-api
https://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-endpoint

转发请申明出处:http://giantliu.com

相关文章