一旦准确利用相关的商量,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你通过UEvoqueL创制查询。

OData是一个磋商,规定公开数据的Web服务的性状。下边这段话是OData的定义

Open Data Protocol
(开放数据左券,OData)是用来查询和更新数据的一种Web公约,其提供了把存在于应用程序中的数据暴揭穿来的法子。OData运用且构建于广大
Web能力之上,比方HTTP、Atom Publishing
Protocol(AtomPub)和JSON,提供了从种种应用程序、服务和累积库中访谈音信的力量。OData被用来从各类数据源中东窗事发和访谈音信,
这一个数据源包涵但不限于:关周到据库、文件系统、内容管理系列和历史观Web站点。

二.怎么搭建

OData共同商议概述

正如上边所波及的,OData服务通过Web服务来揭发所提供的财富。然后您能够通过UWranglerL访谈这几个能源。
OData
合同指明了如何通过HTTP来询问数据。基本尺度是,你能够输入有个别带参数的 USportageL
来对财富开展询问。

上面是一些您可以运用的 OData 公共服务,越多能够运用的 OData
服务,你能够经过拜访 OData 的官方网站来获得。

在介绍使用 OData 左券进行查询时,将会动用这一个公开的 OData
服务。上边以 http://services.odata.org/Northwind/Northwind.svc/

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

图片 1

从上图中你能够观察该服务提供了
Products、Advertisements、Categories、Suppliers
这一个能源。通过输入下边那几个 UGL450L 就可以对那么些财富开展访谈。举例:

那么些查询,将会重临该能源的有着基于 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
格式。只要在UENVISIONL上增添 $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

展开

洋洋时候,大家还必要将涉及的导航属性抽取来。张开上面的U昂CoraL: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
细心:由于VS贰零壹壹的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基本上完毕大家们想要查询的相关方法
对于CU奇骏D程序的查询来讲大大进步开辟功能

四: 相关援用能源
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