一、概述

时间也算充足,抽点时间总结下OData的常用的使用方式,开放数据协议(OData)是一个查询和更新数据的Web协议。OData应用了web技术如HTTP、Atom发布协议(AtomPub)和JSON等来提供对不同应用程序,服务和存储的信息访问。除了提供一些基本的操作(像增删改查),也提供了一些高级的操作类似过滤数据和实体的导航。OData扩展了上述的协议但是不是取代他们。他可以被XML(ATOM)或者JSON取代但是OData的重要在于它符合REST原则。在某种意义上,它建立在'简单'的REST HTTP 服务上,并且有着清晰的目标——简化和标准化我们操作和查询数据的方式。如果你过去在给你的REST服务创建搜索、过滤、或者分页API的时候感觉很麻烦,那么OData将是一个不错的选择。

二、WEB API使用:

  1、通过NuGet获取 Microsoft.AspNet.WebApi.OData 第三方插件DLL,Microsoft.AspNet.WebApi.OData提供可一系列的类扩展了Web API。

  2、WebApiConfig进行下面代码添加,开启OData支持;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Net.Http.Formatting;
using System.Web.Http.OData.Extensions; namespace MyMVCOData
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{ // Web API 路由
config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
); //启用Odata查询
config.Formatters.JsonFormatter.AddQueryStringMapping("$format", "json", "application/json");
config.Formatters.XmlFormatter.AddQueryStringMapping("$format", "xml", "application/xml"); //config.EnableQuerySupport();
config.AddODataQueryFilter(); //config.SetTimeZoneInfo(TimeZoneInfo.Local);
}
}
}

备注:

添加命名空间:using System.Net.Http.Formatting;

 config.Formatters.JsonFormatter.AddQueryStringMapping("$format", "json", "application/json");
 config.Formatters.XmlFormatter.AddQueryStringMapping("$format", "xml", "application/xml");

功能说明:这段代码支持WebAPI数据接口显示可以以XML显示也可以以json格式显示,调用的时候如下:

http://localhost:port/api/ProjectManagent?$format=json 此处以json格式显示结果

http://localhost:port/api/ProjectManagent?$format=xml  此处以xml格式显示结果

3、编写接口 API Control

添加Control 代码如下:

using MyMVCOData.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.OData;
using System.Web.Http.OData.Query; namespace MyMVCOData.Controllers
{
public class MeetingsController : ApiController
{
private readonly IList<Meeting> _scheduledMeetings; public MeetingsController()
{
_scheduledMeetings = new List<Meeting>
{
new Meeting { Id = "", Leader = "Mark Nichols", MeetingDate = new DateTime(, , ), Title = "Project X Planning" },
new Meeting { Id = "", Leader = "Jim Phelps", MeetingDate = new DateTime(, , ), Title = "Mission Discussion" },
new Meeting { Id = "", Leader = "Barney Collier", MeetingDate = new DateTime(, , ), Title = "Advanced Device Technology" },
new Meeting { Id = "", Leader = "Willie Armitage", MeetingDate = new DateTime(, , ), Title = "Maintaining a Strong Presence" },
new Meeting { Id = "", Leader = "Cinnamon Carter", MeetingDate = new DateTime(, , ), Title = "Company Fashion" },
new Meeting { Id = "", Leader = "Rollin Hand", MeetingDate = new DateTime(, , ), Title = "Magic Selling" }
};
} // GET api/Meeting
//[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
//[Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
//[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.Top | AllowedQueryOptions.Skip)]
//[EnableQuery(MaxTop = 100)] 配置调用限制项目
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All,MaxTop =, MaxSkip = ,PageSize =,AllowedFunctions = AllowedFunctions.All)]
public IQueryable<Meeting> Get()
{
return _scheduledMeetings.AsQueryable();
}
}
}

4、接口调用说明:

下表列举了一些常用的Odata操作:

操作

URL

说明

             $filter http://localhost:8090/api/Meetings?$filter=ProductName eq 'Tofu' 根据表达式的状态返回结果(返回ProductName 等于Tofu的Products)
            $orderby http://localhost:8090/api/Meetings?$orderby=ProductName 根据结果排序(根据ProductName列排序)
            $skip http://localhost:8090/api/Meetings?$skip=10 越过结果中的n条数据,常用于分页
            $top http://localhost:8090/api/Meetings?$top=10 返回结果中的前n条记录,常用于分页
           $select http://localhost:8090/api/Meetings?$filter=ProductName eq 'Tofu'&$select=ProductName,UnitPrice 选择需要返回的属性
           $expand http://localhost:8090/api/Meetings?$expand=Supplier 返回Products中包含的导航属性(关联属性)Supplier
          $inlinecount http://localhost:8090/api/Meetings?$inlinecount=allpages 向服务器获取符合条件的资源总数(分页的total值)

通过上面表格的内容,我们还可以通过组合查询条件来实现复杂的查询。

常用查询举例:

  示例1:列出所有Product
  URL:http://localhost:8914/Products

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

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

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

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

  $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
  4.还可以使用数据库函数如:
    $filter=substringof('zz',Name)
    $filter=year(ReleaseDate) gt 2005

  5.关于排序:
    $orderby=Price
    $orderby=Price desc
    $orderby=Category,Price desc

  6.还有一些过滤器如:
    $skip,$top,$inlinecount等等

四、参考博客:

  http://www.cnblogs.com/liuju150/p/4602715.html

http://www.cnblogs.com/shanyou/archive/2013/06/11/3131583.html

五、后续问题:

  针对查询结果时间的输出,目前输出的格式是:

  "MeetingDate": "2016-08-27T08:27:46.2664375+08:00"

  如将日期的输出格式是我们自定义的如:2016-08-27 08:27:46

源码下载

ODATA WEB API(一)---扩展使用的更多相关文章

  1. ODATA WEB API(二)----ODATA服务与客户端

    一.概述 ODATA不经可以作为WebAPI建立相应的WEBAPI控制器,还可以建立ODataControl控制器,能够通过插件建立第三方ODataClinet类库:调用和使用数据变得简单可行. 二. ...

  2. 通过扩展让ASP.NET Web API支持W3C的CORS规范

    让ASP.NET Web API支持JSONP和W3C的CORS规范是解决"跨域资源共享"的两种途径,在<通过扩展让ASP.NET Web API支持JSONP>中我们 ...

  3. 通过扩展让ASP.NET Web API支持W3C的CORS规范(转载)

    转载地址:http://www.cnblogs.com/artech/p/cors-4-asp-net-web-api-04.html CORS(Cross-Origin Resource Shari ...

  4. asp.net web api 版本控制

    版本控制   版本控制的方法有很多,这里提供一种将Odata与普通web api版本控制机制统一的方法,但也可以单独控制,整合控制与单独控制主要的不同是:整合控制通过VersionController ...

  5. ASP.NET Web API编程——版本控制

    版本控制   版本控制的方法有很多,这里提供一种将Odata与普通web api版本控制机制统一的方法,但也可以单独控制,整合控制与单独控制主要的不同是:整合控制通过VersionController ...

  6. ASP.NET Web API 安全筛选器

    原文:https://msdn.microsoft.com/zh-cn/magazine/dn781361.aspx 身份验证和授权是应用程序安全的基础.身份验证通过验证提供的凭据来确定用户身份,而授 ...

  7. Asp.Net Web API(一)

    什么是Web API HTTP不仅仅服务于Web Pages.他也是一个创建展示服务和数据的API的强大平台.HTTP是简单的,灵活的,无处不在的.你能够想象到几乎任何的平台都会有HTTP服务库.HT ...

  8. [转帖]Asp.net MVC 与 Asp.net Web API 区别

    Asp.net MVC 与 Asp.net Web API 区别 https://www.cnblogs.com/viktor988/ https://www.cnblogs.com/terry283 ...

  9. .NET MVC & Web API Cors让AJAX 实现跨域

    什么是Cors? CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源服务器,发出XMLHttpReq ...

随机推荐

  1. 剑指Offer 连续子数组的最大和

    题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...

  2. BZOJ 1718: [Usaco2006 Jan] Redundant Paths 分离的路径

    Description 给出一个无向图,求将他构造成双连通图所需加的最少边数. Sol Tarjan求割边+缩点. 求出割边,然后缩点. 将双连通分量缩成一个点,然后重建图,建出来的就是一棵树,因为每 ...

  3. Python之函数之路

    1 集合 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 创建集合 a = {3, 5, 9, 9, ...

  4. 9.5---括号是否有效(CC150)

    leetcode原题: char temp ; Stack<Character> stack = new Stack<Character>();//error:Stack< ...

  5. Docker configure http proxy

    from: http://stackoverflow.com/questions/23111631/cannot-download-docker-images-behind-a-proxy That' ...

  6. 【GoLang】GoLang 遍历 map、slice、array方法

    代码示例: map1 := make(map[string]string) map1["a"] = "AAA" map1["b"] = &q ...

  7. Kendo UI

    http://www.cnblogs.com/libingql/category/585455.html http://www.scala-china.net/discuz/forum.php?mod ...

  8. oracle11g 连接问题

    一.The Network Adapter could not establish the connection  状态: 失败 -测试失败: IO 错误: The Network Adapter c ...

  9. android studio从1.5更新到2.0后terminal无法运行gradle命令,提示无法找到gradle命令

    android studio从1.5更新到2.0后terminal无法运行gradle命令,提示无法找到gradle命令. 'gradle' 不是内部或外部命令,也不是可运行的程序 或批处理文件. 设 ...

  10. C++中Cstring、wstring 和string互相转换总结

    通过前一篇文章<C++中string,wstring,CString的基本概念和用法>,对Cstring.wstring 和string有了一个了解.string是C++提供的标准字符串操 ...