葡萄娱乐场绽放数据协议利用

一.什么是OData OData是一个开花的数目协议(Open Data Protocol)
在ASP.NET Web API中,
对于CRUD(create, read, update, and
delete)应用比守旧WebAPI扩张了相当大的八面见光
假诺科学运用相关的合计,可以在同样情形下
对二个CRUD应用能够节省多数支付时间,从而抓好开垦成效

OData简介

谈起 WCF Data Service ,不得不说的是 OData。对于一个标准的 Web
服务,它往往会提供了有的功能,比方说:订货、退货这一个,然后使用者通过HTTP协议来利用那么些效应。那是面向服务的主干考虑,但是前边服务有一部分缺点,诸多时候,无法正确预测到用户需求什么样。由此接连要时时刻刻地追加新的接口,不断地修改重返的靶子。

另1种方式是所谓的能源为导向的架构(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奥迪Q5L访问那么些能源。
OData
协议指明了如何通过HTTP来查询数据。基本尺度是,你能够输入有些带参数的 UOdysseyL
来对能源拓展查询。

下边是局地你能够使用的 OData 公共服务,越来越多能够应用的 OData
服务,你能够经过访问 OData 的官方网站来收获。

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

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

葡萄娱乐场 1

从上海教室中您能够看来该服务提供了
Products、Advertisements、Categories、Suppliers
这么些财富。通过输入下边这个 UTucsonL 就可以对那么些能源拓展访问。举个例子:

那一个查询,将会再次来到该能源的具备基于 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汉兰达L上增多 $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

展开

有的是时候,大家还供给将关乎的导航属性抽取来。展开上边的UXC90L: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

当然,你也得以3次开始展览八个导航属性,多少个导航属性之间利用“,”分隔,比如:

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.生成数据库
咱俩运维程序包管控台,运维如下三个指令,
把大家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
瞩目:由于VS20一三的OData模板中OData V三版本的模板,
引用的名号空间要从V叁
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已经为大家把询问功用全做完了
演示一:列出全数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

}

]

}

示例二,查询单个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    }  ]}

示范伍:只列出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
五,仍是可以够运用数据库函数如:
$filter=substringof(‘zz’,Name)
$filter=year(ReleaseDate) gt 2005

至于排序
$orderby=Price
$orderby=Price desc
$orderby=Category,Price desc

再有1对过滤器如
$skip,$top,$inlinecount等等
所以OData基本上达成大家们想要查询的相干办法
对于CU库罗德D程序的询问来讲大大升高开辟效用

4: 相关引用财富
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