OData服务通过Web服务来披露所提供的资源,只要正确选用相关的情商皇冠现金app

示范5:只列出ID为1的Products,只浮现列Name,普赖斯(Price)

OData简介

说起 WCF Data 瑟维斯(Service)(Service) ,不得不说的是 OData。对于一个规范的 Web
服务,它往往会提供了部分功能,比如说:订货、退货那个,然后使用者通过HTTP协议来行使这么些效能。那是面向服务的主题境维,不过面前服务有一些缺点,很多时候,无法准确预测到用户须要什么。因而总是要时时刻刻地追加新的接口,不断地修改重返的靶子。

另一种办法是所谓的资源为导向的架构(ROA),揭示Web服务的资源,并且用户可以对各样对资源开展实时的询问,具有表现多少和组成数据的能力。类似于选取SQL 在数据库中询问数据。唯一的分别是,ROA你通过URL创立查询。

OData是一个合计,规定公开数量的Web服务的特性。上面那段话是OData的概念

Open Data Protocol
(开放数据协议,OData)是用来询问和立异数据的一种Web协议,其提供了把存在于应用程序中的数据暴光出来的章程。OData运用且构建于广大
Web技术之上,比如HTTP、Atom Publishing
Protocol(AtomPub)和JSON,提供了从各样应用程序、服务和存储库中访问新闻的力量。OData被用来从各个数据源中暴光和访问消息,
那几个数据源包罗但不压制:关周到据库、文件系统、内容管理连串和价值观Web站点。

4.增添ProductContext数据库上下文对象,并且在web.config中安插好ConnectionString

排序

运用 $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

到此,大家的OData示例程序已经搭建已毕,我们在浏览器里打开这么些项目标时候
会并发如下

分页

经过 $top 和 $skip 参数,可以开展分页突显,例如:

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

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

过滤

利用 $filter参数,可以对数码开展过滤,例如:

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

二.怎么搭建

OData合计概述

正如下边所涉及的,OData服务通过Web服务来披露所提供的资源。然后你可以通过URL访问那几个资源。
OData
协议指明了怎么着通过HTTP来查询数据。基本条件是,你可以输入某些带参数的 URL
来对资源开展查询。

上面是有的你可以行使的 OData 公共服务,愈多可以动用的 OData
服务,你可以因而走访 OData 的官网来获取。

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

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

皇冠现金app 1

从上图中您可以看出该服务提供了
Products、Advertisements、Categories、Suppliers
那一个资源。通过输入上边这一个 URL 即可对那一个资源拓展访问。例如:

那些查询,将会回去该资源的具备基于 XML-Atom 格式的数码。例如下图是
Products 的数额。

皇冠现金app 2

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

格式输出的数量

默许的格式是 XML-Atom,当然,你也可以别的格式,当前还援救 JSON
格式。只要在URL上添加 $format=json 参数,即可获得 json 格式的多寡。

皇冠现金app 3

5.生成数据库
大家启动程序包管理控制台,运行如下3个指令,
把大家Code First生成的实业生成到数据库
PM> Enable-Migrations
PM> Add-Migration FirstInit
PM> Update-Database
接下来我们可以在服务器资源管理器中来看我们转移的数目库表,如下图
皇冠现金app 4皇冠现金app 5
6.接下来大家在WebApiConfig中登记我们的OData路由

拔取字段  

默许情状下,是会回去所有字段的,但为数不少时候,你恐怕只是亟需取得其余的少数字段。例如下边的询问中只回去
ID 和 Name 字段。

皇冠现金app 6

做一个粗略的订单查询示例
俺们使用Code First格局开创几个实体对象Product(产品),Supplier(供应商)
1.新建一个ASP.NET Empty项目,采纳上接纳Web API,如下图
皇冠现金app 7
2.使用NuGet引用OData和EntityFramework程序集
皇冠现金app 8
3.在Models文件夹中扩张Product(产品),Supplier(供应商)八个实体

展开

很多时候,大家还须求将关乎的导航属性取出来。打开下边的
URL:http://services.odata.org/Northwind/Northwind.svc/$metadata

从上边这几个图能够观察,Product 还有 Category、Order_Details、Supplier
几个导航属性。

皇冠现金app 9

由此 expand 参数,可以把相关的领航属性的数量一并取出。输入
http://services.odata.org/Northwind/Northwind.svc/Products?$format=json&$expand=Supplier

皇冠现金app 10

自然,你也足以五次举行四个导航属性,五个导航属性之间采取“,”分隔,例如:

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

下边是$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

三.怎么利用 是因为没有测试数据,我们开端先在数据库表里为Products和Suppliers扩大部分测试数据
皇冠现金app 11
皇冠现金app 12
接下去我们看看一些简易的运用示例
在自动生成的ProductsController和SuppliersController中
曾经为大家转变了之类一些Action
皇冠现金app 13皇冠现金app 14
故而对于部分伸张,修改,删除,更新自己就不做过多示例,
那几个都是和WebAPI没有啥样太多不相同,
我第一示例的是询问的接纳,不得不说OData已经为大家把询问作用全做完了
以身作则1:列出所有Product
URL:http://localhost:8914/Products

{  "@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    }  ]}
<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>
{  "@odata.context":"http://localhost:8914/$metadata","value":[    {      "name":"Products","kind":"EntitySet","url":"Products"    },{      "name":"Suppliers","kind":"EntitySet","url":"Suppliers"    }  ]}
{  "@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"      }    }  ]}
{

"@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

}

]

}

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

{  "@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    }  ]}

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

 

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

{  "@odata.context":"http://localhost:8914/$metadata#Products/$entity","Id":1,"Name":"Products1","Price":100.00,"Category":"Test","SupplierId":1}
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; }    }

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

{  "@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    }  ]}
public class ProductContext : DbContext    {        public ProductContext()            : base("Demo")        { }        public DbSet<Product> Products { get; set; }        public DbSet<Supplier> Suppliers { get; set; }    }

还有部分过滤器如
$skip,$top,$inlinecount等等
由此OData基本上已毕大家们想要查询的连带办法
对于CURD程序的查询来说大大升高开发成效

四: 相关引用资源
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

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

表示已经搭建成功了

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

7.接下来大家独家为Product和Supplier新建ODataController,
皇冠现金app 15
皇冠现金app 16
大家在上图中大家挑选好模型类和数目上下文,
一碗水端平复上边两步为Supplier实体也转移对应的ODataController
小心:由于VS2013的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是一个绽放的数据协议(Open Data Protocol)
在ASP.NET Web API中,
对此CRUD(create, read, update, and
delete)应用比传统WebAPI扩张了很大的八面玲珑
假定科学采用有关的说道,可以在平等情形下
对一个CRUD应用可以节约很多付出时间,从而升高用度效能

{  "@odata.context":"http://localhost:8914/$metadata#Products(Name,Price)/$entity","Name":"Products1","Price":100.00}
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());        }    }}

相关文章