zoukankan      html  css  js  c++  java
  • 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 参数我查到相关资料后再整理。

  • 相关阅读:
    /etc/sysconfig/network-scripts/ifcfg-eth0
    虚拟机不能上网
    VMware3种网络模式
    SecureCRT学习之道:用SecureCRT来上传和下载数据
    SecureCRT学习之道:SecureCRT 常用技巧
    SecureCRT学习之道:SecureCRT常用快捷键设置与字体设置方法
    CentOS7 编译安装LNMP
    提高PHP编程效率的方法
    基于CentOS 5.4搭建nginx+php+spawn-fcgi+mysql高性能php平台
    Linux系统部署规范v1.0
  • 原文地址:https://www.cnblogs.com/smileberry/p/6929646.html
Copyright © 2011-2022 走看看