mvc api odata查询选项之 $inlinecount $format 选项(转)
出处:http://www.it165.net/pro/html/201505/40236.html
网上百度“odata 语法”会出来很多结果,其中有一项是比较一致的,那就是odata支持一下几种语法:
$filter 条件表达式 -- 对应sql语句的where条件查询,如:/Categories?$filter=name eq 'liumang'
$expand 包含属性和关系 -- 对应表的外键关系,如:/Categories?$expand=Products
$select 查询字段的列表 -- 对应sql语句select后面的字段,如:/Categories?$select=id,name
$count 查询数量 -- 根据当前查询条件返回的总记录数,如Categories表中有10条记录,则/Categories?count 或者 /Categories?count=true
(ps:这条我没有找到具体确切的用法,在AllowedQueryOptions 枚举中也没有列出这条选项)
$orderby 排序 -- 对应sql语句order by语句,如:/Categories?$orderby=id,name ,/Categories?$orderby=id,name desc(asc) ,/Categories?$orderby=id desc,name asc
$skip 当前查询跳过多少条数据,再返回查询结果,如:/Categories?$orderby=id&$skip=10,如果id是连续的话,那么返回从id=11之后的所有数据
$top 返回当前查询的前多少条数据,如/Categories?$top=10
skip 和top 一般是配合一起使用,用来做分页查询,如/Categories?$skip=10&$top=10 ,/Categories?$skip=20&$top=10 ,这样就可以做出一个pagesize 为10的分页查询了
$inlinecount 返回当前查询条件的所有记录数,如:/Categories?$inlinecount=allpages ,如果Categories有23条数据,则返回23
$skiptoken 例如游标或者书签的一个东西
$metadata 显示元数据
以上是在网上找到的相关资料,资料很齐全,很多都给出了案列,但是在我实际的使用中,却只有几项数据能够使用,其他的都不适用,我分析原因可能如下 :
1:我做的项目是集成在mvc和api里面的,而网上的很多例子大都是wcf的案列,我不太清楚是不是这个原因,因为wcf我只知道皮毛,没有深入
2:在程序集 System.Web.Http.OData.dll, v4.0.0.0 中有这样一段注释:
//
// 摘要:
// 获取或设置允许在查询内部使用的查询参数。默认值为所有查询选项,包括 $filter、$skip、$top、$orderby、$expand、$select、$inlineCount、$format
// 和 $skipToken。
//
// 返回结果:
// 返回 System.Web.Http.OData.Query.AllowedQueryOptions。<br> public AllowedQueryOptions AllowedQueryOptions { get; set; }<br>
可以看出 AllowedQueryOptions 枚举和上面列出的还是有一些出入的
3:同样在程序集 System.Web.Http.OData.dll, v4.0.0.0 中还有这样一段注释:
namespace System.Web.Http.OData.Query
// 摘要:
// 此项定义可用于执行查询撰写的复合 OData 查询选项。此项当前仅支持 $filter、$orderby、$top 和 $skip。
//
// 类型参数:
// TEntity:
[ODataQueryParameterBinding]
public
class
ODataQueryOptions<TEntity> : ODataQueryOptions
可以看出只支持四个选项,这和我在项目中的使用情况是一致的。
ps:让我疑惑的一点就是,odata 4.0里面是支持我上面列出的所有查询选项的,而在api 2.2发布的时候则是明确表示支持odata 4.0的,我不知道是什么原因导致我现在的项目中只支持四个选项.
说了这么多后,回到主题上面来,在项目中其实 $filter、$orderby、$top 和 $skip 四个选项是可以支持90%左右的查询功能的
其余10%的功能比如:分页查询时必须知道的总记录数、返回json字符串、外键关系等
下面说一下我在网上查到的关于$inlinecount ,$format的解决方法
$format
需要odata支持$format参数只需要一句语句即可
public
static
class
WebApiConfig
{
public
static
void
Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name:
"DefaultApi"
,
routeTemplate:
"api/{controller}/{id}"
,
defaults:
new
{ id = RouteParameter.Optional }
);<br>
//添加下面这句代码即可支持$format查询选项,当然需要添加程序集 System.Net.Http.Formatting.dll
config.Formatters.JsonFormatter.AddQueryStringMapping(
"$format"
,
"json"
,
"application/json"
);
}
}
$inlinecount
这个也不需要太多复杂的操作,代码如下
public
class
testController : ApiController
{
testBLL DB =
new
testBLL();
public
PageResult<dict> Get(ODataQueryOptions<dict> options)
{
int
pageSize =
10
;
ODataQuerySettings settings =
new
ODataQuerySettings()
{
PageSize = pageSize
};
IQueryable results = options.ApplyTo(DB.FindAll().AsQueryable(), settings);
return
new
PageResult<dict>(
results as IEnumerable<dict>,
Request.GetNextPageLink(),
Request.GetInlineCount());
}
}
查询url : http://localhost:3812/api/test?$skip=20&$inlinecount=allpages
返回格式如下:
{ "Items": ["json字符串"], "NextPageLink" :"下一页url", "Count": number//总记录数 } 参考网络资料:http://www.2cto.com/kf/201312/266851.html 在这里我做了一个实验,因为在实际的案列环境中,用户是可以自己选择每页显示记录数的,但是这个列子里面却是写死的。 所以我修改了一下代码如下:
1.
int
pageSize = options.Top ==
null
?
10
: options.Top.Value;
在用户选择了记录数时,按照用户选择的设置,可以动态的返回下一页的记录,但是返回的NextPageLink的值却为null,当我去掉top参数时,返回是正常数据
下面是反编译了System.Web.Http.OData.dll之后的源代码 ,我想可能在请求发送过来,在设置参数的时候,判断了过top参数所导致的
public
static
Uri GetNextPageLink(
this
HttpRequestMessage request)
{
object obj2;
if
(request ==
null
)
{
throw
Error.ArgumentNull(
"request"
);
}
if
(request.get_Properties().TryGetValue(
"MS_NextPageLink"
, out obj2))
{
return
(obj2 as Uri);
}
return
null
;
}
上面是$format 和 $inlinecount参数的设置方法,$expand 参数我查到相关资料后再整理。
mvc api odata查询选项之 $inlinecount $format 选项(转)的更多相关文章
- mvc api odata 查询选项之 $inlinecount ,$format 选项
网上百度“odata 语法”会出来很多结果,其中有一项是比较一致的,那就是odata支持一下几种语法: $filter 条件表达式 -- 对应sql语句的where条件查询,如:/Categorie ...
- SharePoint REST API - OData查询操作
博客地址:http://blog.csdn.net/FoxDave 本篇主要讲述SharePoint REST中OData的查询操作.SharePoint REST服务支持很多OData查询字符串 ...
- MVC项目实践,在三层架构下实现SportsStore-09,ASP.NET MVC调用ASP.NET Web API的查询服务
ASP.NET Web API和WCF都体现了REST软件架构风格.在REST中,把一切数据视为资源,所以也是一种面向资源的架构风格.所有的资源都可以通过URI来唯一标识,通过对资源的HTTP操作(G ...
- 使用Dynamics 365 CE Web API查询数据加点料及选项集字段常用查询
微软动态CRM专家罗勇 ,回复336或者20190516可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me. 紧接上文:配置Postman通过OAuth 2 implicit ...
- Dynamics 365 We API ODATA语法根据父记录查询子记录,根据子记录查询父记录(附上根据团队,队列名称查成员)
微软动态CRM专家罗勇 ,回复333或者20190508可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! 先举个N:N关系的例子.这里以根据团队的名称查找其所有团队成员的 ...
- 让Asp.Net WebAPI支持OData查询,排序,过滤。
让Asp.Net WebAPI支持OData后,就能支持在url中直接输入排序,过滤条件了. 一.创建Asp.Net WebAPI项目: 二.使用NuGet安装Asp.Net WebAPI 2.2和O ...
- vs2012 + web api + OData + EF + MYsql 开发及部署
先说下我的情况,b/s开发这块已经很久没有搞了,什么web api .MVC.OData都只是听过,没有实际开发过,因为最近要开发一个手机app的服务端,所以准备用这套框架来开发. 下面开始进入正题( ...
- vs2012 + web api + OData + EF + MYsql
vs2012 + web api + OData + EF + MYsql 开发及部署 先说下我的情况,b/s开发这块已经很久没有搞了,什么web api .MVC.OData都只是听过,没有实际开发 ...
- 让Asp.Net WebAPI支持OData查询,排序,过滤。(转)
出处:http://www.cnblogs.com/liuzhendong/p/4233380.html 让Asp.Net WebAPI支持OData后,就能支持在url中直接输入排序,过滤条件了. ...
随机推荐
- eclipse工程 'cocostudio/CocoStudio.h' file not found
android.mk里有这样配置: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) $(call import-add-path,$(LOCAL_ ...
- Jacoco+Jenkines小白之路
Jacoco+Jenkines小白之路 最近工作中正在推广jacoco的增量覆盖率的统计,想学习一波,纯粹采坑中,适合小白学习jacoco. 一.代码覆盖率 引入代码覆盖率 : 代码覆盖率是指对现有代 ...
- 再看Spring Could微服务的关键组件
Consul是用go开发的开源注册中心服务,内置服务发现与注册.raft一致性协议实现.健康检查.多数据中心等方案.与Eurker相比,consul还能对异构服务如rpc提供支持. 作为微服务系统的核 ...
- (原创)AP6212蓝牙模块在am335x控制板上的应用
主控板wifi模块调通后接着调试蓝牙,经过两周的摸索,终于把蓝牙应用基本建立起来,下面记录下大概流程. 1.硬件管脚设置 static void uart4_init(int evm_id, int ...
- linux系统硬件配置
转自:http://blog.163.com/yang_jianli/blog/static/1619900062010391127338/ 一:查看cpu more /proc/cpuinfo | ...
- 02 - Unit011:Spring AOP
Spring AOP 面向切面(儿)编程(横切编程) Spring 核心功能之一 Spring 利用AspectJ 实现. 底层是利用 反射的动态代理机制实现的 其好处: 在不改变原有功能情况下, 为 ...
- 02 - Unit09:动态SQL
动态SQL 什么是? 系统运行过程中,动态生成的SQL语句 为什么? 当我们不能确定用户操作,所要使用的具体SQL的时候. 案例: 搜索笔记功能 按用户名 笔记本名 笔记名 搜索 搜索功能 按用户 A ...
- bzoj2865 字符串识别
Description XX在进行字符串研究的时候,遇到了一个十分棘手的问题. 在这个问题中,给定一个字符串S,与一个整数K,定义S的子串T=S(i, j)是关于第K位的识别子串,满足以下两个条件: ...
- spring 源码如何导入到eclipse
spring 源码如何导入到eclipse spring源码解析——spring源码导入eclipse spring framework源码下载并导入eclipse
- nohup 后台运行命令
在Linux上部署zipkin,在SSH客户端执行java -jar zipkin-server-1.21.0-exec.jar,启动成功,在关闭SSH客户端后,运行的程序也同时终止了,怎样才能保证在 ...