快速搭建WebAPI(Odata+Code-First)附Odata条件查询表~
Odata是什么?
开放数据协议(Open Data Protocol,缩写OData)是一种描述如何创建和访问Restful服务的OASIS标准。该标准由微软发起,前三个版本1.0、2.0、3.0都是微软开放标准,遵循 [1] 。第四个版本4.0于2014年3月17日在OASIS投票通过成为开放工业标准 [2] 。
为什么需要OData?
OData是一个协议,一个标准。所以这个问题等同于为什么我们需要协议。类比TCP协议就可以理解一般。假设你开发的组件必须要和某个第三方组件通信,如果第三方组件不支持TCP而只支持其内部开发的一个私有协议,你就肯定头大了,你必须在你的组件里单独为其实现这个私有协议。如果大家都支持TCP协议,不就省事了么。这就是标准协议的作用:协议和标准用于制定一个统一通用的规则。 我们只需要按照这个协议或标准生产组件,那么这个组件就可以方便的和其他组件集成/协作。而无须根据其他组件的私有标准定制化组件。
如何使用OData?

Odata目前已经不怎么更新了,目前最高的5.7已经停留在2015年8月21 远古时代,然后我们还需要在WebApiConfig.cs中配置Odata
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<TRoles>("TRoles");
builder.EntitySet<TUsers>("TUsers");
builder.EntitySet<TUsersRoles>("TUsersRoles");
config.Routes.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
其中builder.EntitySet<TRoles>("TRoles"); 需要注意的是EntitySet这个方法是对你的实体类进行配置,其底层是要获取的类型放到它的配置项里。
Code-First 方式 create DataBase
Context.cs
public Model1()
: base("name=CodeFirstDemo")
{
} public DbSet<TUsers> Users { get; set; }
public DbSet<TRoles> Roles { get; set; }
public DbSet<TUsersRoles> UsersRoles { get; set; }
其它的三个类就不写上来了,不想占用博客园的资源,也不想写没有意义的!
创建webAPIController


创建完的代码展示:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.ModelBinding;
using System.Web.Http.OData;
using System.Web.Http.OData.Routing;
using heheda.Models; namespace heheda.Controllers
{
/*
The WebApiConfig class may require additional changes to add a route for this controller. Merge these statements into the Register method of the WebApiConfig class as applicable. Note that OData URLs are case sensitive. using System.Web.Http.OData.Builder;
using System.Web.Http.OData.Extensions;
using heheda.Models;
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<TRoles>("TRoles");
builder.EntitySet<TUsersRoles>("UsersRoles");
config.Routes.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
*/
public class TRolesController : ODataController
{
private Model1 db = new Model1(); // GET: odata/TRoles
[EnableQuery]
public IQueryable<TRoles> GetTRoles()
{
return db.Roles;
} // GET: odata/TRoles(5)
[EnableQuery]
public SingleResult<TRoles> GetTRoles([FromODataUri] int key)
{
return SingleResult.Create(db.Roles.Where(tRoles => tRoles.Id == key));
} // PUT: odata/TRoles(5)
public IHttpActionResult Put([FromODataUri] int key, Delta<TRoles> patch)
{
Validate(patch.GetEntity()); if (!ModelState.IsValid)
{
return BadRequest(ModelState);
} TRoles tRoles = db.Roles.Find(key);
if (tRoles == null)
{
return NotFound();
} patch.Put(tRoles); try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
if (!TRolesExists(key))
{
return NotFound();
}
else
{
throw;
}
} return Updated(tRoles);
} // POST: odata/TRoles
public IHttpActionResult Post(TRoles tRoles)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
} db.Roles.Add(tRoles);
db.SaveChanges(); return Created(tRoles);
} // PATCH: odata/TRoles(5)
[AcceptVerbs("PATCH", "MERGE")]
public IHttpActionResult Patch([FromODataUri] int key, Delta<TRoles> patch)
{
Validate(patch.GetEntity()); if (!ModelState.IsValid)
{
return BadRequest(ModelState);
} TRoles tRoles = db.Roles.Find(key);
if (tRoles == null)
{
return NotFound();
} patch.Patch(tRoles); try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
if (!TRolesExists(key))
{
return NotFound();
}
else
{
throw;
}
} return Updated(tRoles);
} // DELETE: odata/TRoles(5)
public IHttpActionResult Delete([FromODataUri] int key)
{
TRoles tRoles = db.Roles.Find(key);
if (tRoles == null)
{
return NotFound();
} db.Roles.Remove(tRoles);
db.SaveChanges(); return StatusCode(HttpStatusCode.NoContent);
} // GET: odata/TRoles(5)/TRolesUsersList
[EnableQuery]
public IQueryable<TUsersRoles> GetTRolesUsersList([FromODataUri] int key)
{
return db.Roles.Where(m => m.Id == key).SelectMany(m => m.TRolesUsersList);
} protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
} private bool TRolesExists(int key)
{
return db.Roles.Count(e => e.Id == key) > 0;
}
}
}
在之后我们就可以在前端中去通过这个协议规则去过滤我们的数据了!
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值) |
快速搭建WebAPI(Odata+Code-First)附Odata条件查询表~的更多相关文章
- [转]OData的初步认识 OData v4 Client Code Generator
本文转自:http://www.cnblogs.com/1zhk/p/5356053.html What – OData是什么? OData - Open Data Protocol,是一个设计和使用 ...
- .net core系列之《sdk和runtime区别及使用CLI在Ubuntu上快速搭建Console,WebApi,MVC三大应用模型》
一.需要安装的软件 1.虚拟机安装Ubuntu系统(本人用的是vmware-14.1.12和buntu-18.04) 2.Xshell或 Putty(连接ssh服务) 3.FileZilla(ftp上 ...
- 利用Columnal网格系统快速搭建网站的基本布局结构
1.下面是一些对响应式设计提供了不同程度支持的CSS框架: (1)Semantic(http://semantic.gs); (2)Skeleton(http://getskeleton.com); ...
- Jenkins+Maven+SVN快速搭建持续集成环境(转)
Jenkins是一个可扩展的持续集成引擎,Jenkins非常易于安装和配置,简单易用,下面看看我们是如何几分钟就快速搭建一个持续集成环境吧. 假设我们目前已经有2个maven项目:entities(J ...
- WAMP Server助你在Windows上快速搭建PHP集成环境
WAMP Server助你在Windows上快速搭建PHP集成环境 原文地址 我想只要爬过几天网的同学都会知道PHP吧,异次元的新版本就是基于PHP的WordPress程序制造出来的,还有国内绝大部分 ...
- 拿nodejs快速搭建简单Oauth认证和restful API server攻略
拿nodejs快速搭建简单Oauth认证和restful API server攻略:http://blog.csdn.net/zhaoweitco/article/details/21708955 最 ...
- 基于 Jenkins 快速搭建持续集成环境--转
源地址:http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/ 持续集成是一种软件开发实践,对于提高软件开发效率并保障软件开发质量提供了理论基础 ...
- Jenkins 快速搭建持续集成环境
持续集成概述 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软件工程领域 ...
- Jenkins快速搭建持续集成
基于Jenkins快速搭建持续集成环境 Jenkins+tortoisesvn+MSBuild做到持续集成 附Jenkins的使用:http://www.infoq.com/cn/articles/M ...
随机推荐
- CentOS7完成mysql的安装和远程访问
详见链接https://blog.csdn.net/weixin_42266606/article/details/80879571 (此处我的本地用户名root,密码root:远程用户名root,密 ...
- vs编译OpenGL项目,出现无法打开 源 文件 "gl\glaux.h的解决办法
问题如图: 原因: 缺少编译OpenGL的头文件和库: 解决办法: 1.下载OpenGL的头文件和库: 下载地址:https://download.csdn.net/download/ssagnn23 ...
- Ubuntu 18.04 系统配置 NPM环境和mysql数据库问题解决
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. 今天我就为大家 使用 Ubun ...
- PHP通过get方法获得form表单数据方法总结
下面给大家带来具体的代码示例: 1.form表单代码示例(表单get提交) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <head> <meta cha ...
- tf.contrib.slim.data数据加载(1) reader
reader: 适用于原始数据数据形式的Tensorflow Reader 在库中parallel_reader.py是与reader相关的,它使用多个reader并行处理来提高速度,但文件中定义的类 ...
- Linux进阶命令用法
1.tr命令 可以对来自标准输入的字符进行替换.压缩和删除.它可以将一组字符变成另一组字符 选项 -c或——complerment:取代所有不属于第一字符集的字符: -d或——delete:删除所有属 ...
- 非vue-cli的花括号闪现问题
<div id="app" v-cloak></div>[v-cloak] { display: none;}这种方式可以解决网速较慢,vue.js文件还没 ...
- 一个'&'引起md5签名不一致问题
有时会遇到这样一个问题,本地和接口在验证数据签名时,明明两端打印出来的两个字符串一模一样,但是md5加密后的两个密文却不一样.例如:本地字符串:$str = "a=1&b=2& ...
- this全解js
转(掘金) this关键字是JavaScript中最复杂的机制之一,是一个特别的关键字,被自动定义在所有函数的作用域中,但是相信很多JavaScript开发者并不是非常清楚它究竟指向的是什么.听说你很 ...
- Java课堂笔记(零):内容索引
回想自己学习和使用Java的时间也是很长了.本科期间课堂上浅尝辄止地学习了点皮毛,后来也是搁置不用,未曾深入研究.研究生期间因为项目和实习的原因,基本算是重新拾起Java这门语言,并且接触到了Spri ...