http://www.alixixi.com/program/a/2015063094986.shtml

一.什么是OData
OData是一个开放的数据协议(Open Data Protocol)
在ASP.NET Web API中,
对于CRUD(create, read, update, and delete)应用比传统WebAPI增加了很大的灵活性
只要正确使用相关的协议,可以在同等情况下
对一个CRUD应用可以节约很多开发时间,从而提高开发效率

二.怎么搭建

做一个简单的订单查询示例
我们使用Code First模式创建两个实体对象Product(产品),Supplier(供应商)
1.新建一个ASP.NET Empty项目,选择上使用Web API,如下图

2.使用NuGet引用OData和EntityFramework程序集

3.在Models文件夹中增加Product(产品),Supplier(供应商)两个实体

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; }
    }

4.增加ProductContext数据库上下文对象,并且在web.config中配置好ConnectionString

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

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

5.生成数据库
我们启动程序包管理控制台,运行如下3个命令,
把我们Code First生成的实体生成到数据库
PM> Enable-Migrations
PM> Add-Migration FirstInit
PM> Update-Database
然后我们可以在服务器资源管理器中看到我们生成的数据库表,如下图

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,


我们在上图中我们选择好模型类和数据上下文,
并重复上面两步为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.context":"http://localhost:8914/$metadata","value":[
    {
      "name":"Products","kind":"EntitySet","url":"Products"
    },{
      "name":"Suppliers","kind":"EntitySet","url":"Suppliers"
    }
  ]
}

表示已经搭建成功了

三.怎么使用
由于没有测试数据,我们开始先在数据库表里为Products和Suppliers增加一些测试数据


接下来我们看看一些简单的使用示例
在自动生成的ProductsController和SuppliersController中
已经为我们生成了如下一些Action

所以对于一些增加,修改,删除,更新我就不做过多示例,
这些都是和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基本上实现我们们想要查询的相关方法
对于CURD程序的查询来说大大提高开发效率

在ASP.NET Web API中使用OData的更多相关文章

  1. ASP.NET Web API中使用OData

    在ASP.NET Web API中使用OData 一.什么是ODataOData是一个开放的数据协议(Open Data Protocol)在ASP.NET Web API中,对于CRUD(creat ...

  2. ASP.NET Web API中的Controller

    虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...

  3. ASP.NET Web API 中的异常处理(转载)

    转载地址:ASP.NET Web API 中的异常处理

  4. 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化

    谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...

  5. Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET W ...

  6. ASP.NET WEB API 中的路由调试与执行过程跟踪

    路由调试 RouteDebugger 是调试 ASP.NET MVC 路由的一个好的工具,在ASP.NET WEB API中相应的有 WebApiRouteDebugger ,Nuget安装 Inst ...

  7. 能省则省:在ASP.NET Web API中通过HTTP Headers返回数据

    对于一些返回数据非常简单的 Web API,比如我们今天遇到的“返回指定用户的未读站内短消息数”,返回数据就是一个数字,如果通过 http response body 返回数据,显得有些奢侈.何不直接 ...

  8. ASP.NET Web API中的参数绑定总结

    ASP.NET Web API中的action参数类型可以分为简单类型和复杂类型. HttpResponseMessage Put(int id, Product item) id是int类型,是简单 ...

  9. 【ASP.NET Web API教程】5.5 ASP.NET Web API中的HTTP Cookie

    原文:[ASP.NET Web API教程]5.5 ASP.NET Web API中的HTTP Cookie 5.5 HTTP Cookies in ASP.NET Web API 5.5 ASP.N ...

随机推荐

  1. SSD框架训练自己的数据集

    SSD demo中详细介绍了如何在VOC数据集上使用SSD进行物体检测的训练和验证.本文介绍如何使用SSD实现对自己数据集的训练和验证过程,内容包括: 1 数据集的标注2 数据集的转换3 使用SSD如 ...

  2. 图像处理中任意核卷积(matlab中conv2函数)的快速实现。

    卷积其实是图像处理中最基本的操作,我们常见的一些算法比如:均值模糊.高斯模糊.锐化.Sobel.拉普拉斯.prewitt边缘检测等等一些和领域相关的算法,都可以通过卷积算法实现.只不过由于这些算法的卷 ...

  3. vs 2015 写php太爽了,毕竟我接触的第一款ide就是vs啊

  4. iOS开发编译报错、常见问题(实时更新)

    一.报错与警报 1.错误代码:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCH ...

  5. Beaglebone Back学习一(开发板介绍)

    随着开源软件的盛行.成熟,开源硬件也迎来了春天,先有Arduino,后有Raspherry Pi,到当前的Beaglebone .相信在不久的将来,开源项目将越来越多,越来越走向成熟.         ...

  6. 用不动点组合子解递归(python实现)

    不动点组合子 Y = λf. (λx. f (x x)) (λx. f (x x)) θ = (λx. λy. (y(x x y))) (λx.λy.(y(x x y))) Y f = f (Y f) ...

  7. [置顶] WebService调用工具(AXIS2)

    package com.metarnet.util; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Meth ...

  8. (转)html中 cookie设置

    box=="checkBox  '是否记住用户密码'": window.onload=function init() {    var box = getCookie(" ...

  9. hdu 1880 魔咒字典

    https://vjudge.net/problem/HDU-1880 题意:略 思路: 一开始就是想到了正确的思路,但是代码写炸了,死活过不了.这题嘛,就是建议一个魔咒与咒语的双向映射.首先用字符串 ...

  10. MVC Razor视图下ViewData传递html内容被转义

    页面输出: html源码: <div style="width: 90%; height: auto;"> <p>付凯航 阿豆 ADOU</p> ...