• 请MVC5 WebApi2 支持OData协议查询


    一、配置项

    1、WebApiConfig.cs添加如下代码:

    //  api 支持 cors允许Ajax发起跨域的请求(nuget 中搜索 ASP.NET Cross-Origin Support,然后安装)
     var cors = new System.Web.Http.Cors.EnableCorsAttribute("*", "*", "*");
      config.EnableCors(cors);
     // api 支持 odata 查询( nuget 中搜索 ASP.NET Web API OData)
     System.Web.Http.OData.Extensions.HttpConfigurationExtensions.AddODataQueryFilter(config);

    2、Global.asax.cs添加如下代码:

    //添加 ASP.NET Web API 2 的 全部集合,注意这个要放在前面
     GlobalConfiguration.Configure(WebApiConfig.Register);
     RouteConfig.RegisterRoutes(RouteTable.Routes);

    二、使用方法

    ODataController.cs

    [EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
    //[EnableQuery(MaxTop = 100)] // 指定 top 参数的最大值为 100
    //[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.Skip | AllowedQueryOptions.Top)]
    public IQueryable<Sites> Get()
    {
        List<Sites> siteslist = ...;
        return siteslist.AsQueryable();
    }

    三、查询示例:

    1、 查询前10条数据,并返回Id值小于10的数据集合:

    http://localhost:49636/api/odata?$top=10&$filter=Id lt 10

     2、查询ParnetId等于6551的数据人集合:

    http://localhost:49636/api/app?$filter=ParentId eq 6551

    3、上面的集合按照Code倒序排列:

    http://localhost:49636/api/app?$filter=ParentId eq 6551&$orderby=Code desc

    4、只返回Name,Id属性的集合:

    http://localhost:49636/api/app?$format=json&$select=Name,Id
    运算符描述示例

    eq

    等于

    /AccountSet?$filter=Address1_City eq 'Redmond'

    ne

    不等于

    /AccountSet?$filter=Address1_City ne null

    gt

    大于

    /AccountSet?$filter=CreditLimit/Value gt 1000

    ge

    大于或等于

    /AccountSet?&$filter=CreditLimit/Value ge 1000

    Lt

    小于

    /AccountSet?$filter=CreditLimit/Value lt 1000

    le

    小于或等于

    /AccountSet?$filter=CreditLimit/Value le 1000

    and

    逻辑与

    /AccountSet?$filter=CreditLimit/Value ge 1000 and Address1_StateOrProvince eq 'TX'

    or

    逻辑或

    /AccountSet?$filter=AccountCategoryCode/Value eq 2 or AccountRatingCode/Value eq 1

    not

    逻辑非

    /AccountSet?$filter=(AccountCategoryCode/Value ne null) and not (AccountCategoryCode/Value eq 1)

     

    选项说明

    $expand

    指示应在所检索的记录或集合中检索相关记录。

    $filter

    指定为在集合中返回记录计算结果必须为 true 的表达式或函数。

    $orderby

    确定使用哪些值对记录集合进行排序。

    $select

    指定要返回的属性子集。

    $skip

    设置在集合中检索记录之前要跳过的记录数。

    $top

    确定要返回的最大记录数。

    相关教程:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api

    The Service:

    It all starts with a Data Service hosted somewhere:

    http://server/service.svc

    Basic queries:

    You access the Data Service entities through resource sets, like this:

    http://server/service.svc/People

    You request a specific entity using its key like this:

    http://server/service.svc/People(16)

    Or by using a reference relationship to something else you know:

    http://server/service.svc/People(16)/Mother

    This asks for person 16’s mother.

    Once you have identified an entity you can refer to it’s properties directly:

    http://server/service.svc/People(16)/Mother/Firstname

    $value:

    But the last query wraps the property value in XML, if you want just the raw property value you append $value to the url like this:

    http://server/service.svc/People(16)/Mother/Firstname/$value

    $filter:

    You can filter resource sets using $filter:

    http://server/service.svc/People?$filter=Firstname  eq ‘Fred’

    Notice that strings in the filter are single quoted.

    Numbers need no quotes though:

    http://server/service.svc/Posts?$filter=AuthorId eq 1

    To filter by date you have identity the date in the filter, like this:

    http://server/service.svc/Posts?$filter=CreatedDate eq DateTime’2009-10-31′

    You can filter via reference relationships:

    http://server/service.svc/People?$filter=Mother/Firstname eq ‘Wendy’

    The basic operators you can use in a filter are:

    Operator

    Description

    C# equivalent

    eq

    equals

    ==

    ne

    not equal

    !=

    gt

    greater than

    >

    ge

    greater than or equal

    >=

    lt

    less than

    <

    le

    less than or equal

    <=

    and

    and

    &&

    or

    or

    ||

    ()

    grouping

    ()

    There are also a series of functions that you can use in your filters if needed.

    $expand:

    If you want to include related items in the results you use $expand like this:

    http://server/service.svc/Blogs?$expand=Posts

    This returns the matching Blogs and each Blog’s posts.

    $select:

    Some Data Services allow you to limit the results to just the properties you require – aka projection – for example if you just want the Id and Title of matching Posts you would need something like this:

    http://server/service.svc/Posts?$select=Id,Title

    You can even project properties of related objects too, like this:

    http://server/service.svc/Posts?$expand=Blog&$select=Id,Title,Blog/Name

    This projects just the Id, Title and the Name of the Blog for each Post.

    $count:

    If you just want to know how many records would be returned, without retrieving them you need $count:

    http://server/service.svc/Blogs/$count

    Notice that $count becomes one of the segments of the URL – it is not part of the query string – so if you want to combine it with another operation like $filter you have to specify $count first, like this:

    http://server/service.svc/Posts/$count?$filter=AuthorId eq 6

    This query returns the number of posts authored by person 6.

    $orderby:

    If you need your results ordered you can use $orderby:

    http://server/service.svc/Blogs?$orderby=Name

    Which returns the results in ascending order, to do descending order you need:

    http://server/service.svc/Blogs?$orderby=Name%20desc

    To filter by first by one property and then by another you need:

    http://server/service.svc/People?$orderby=Surname,Firstname

    Which you can combine with desc if necessary.

    $top:

    If you want just the first 10 items you use $top like this:

    http://server/service.svc/People?$top=10

    $skip:

    If you are only interested in certain page of date, you need $top and $skip together:

    http://server/service.svc/People?$top=10&$skip=20

    This tells the Data Service to skip the first 20 matches and return the next 10. Useful if you need to display the 3rd page of results when there are 10 items per page.

    Note: It is often a good idea to combine $top & $skip with $orderby too, to guarantee the order results are retrieved from the underlying data source is consistent.

    $inlinecount & $skiptoken:

    Using $top and $skip allows the client to control paging.

    But the server also needs a way to control paging – to minimize workload need to service both naive and malicious clients – the OData protocol supports this via Server Driven Paging.

    With Server Driven Paging turned on the client might ask for every record, but they will only be given one page of results.

    This as you can imagine can make life a little tricky for client application developers.

    If the client needs to know how many results there really are, they can append the $inlinecount option to the query, like this:

    http://server/service.svc/People?$inlinecount=allpages

    The results will include a total count ‘inline’, and a url generated by the server to get the next page of results.

    This generated url includes a $skiptoken, that is the equivalent of a cursor or bookmark, that instructs the server where to resume:

    http://server/service.svc/People?$skiptoken=4

    $links

    Sometime you just need to get the urls for entities related to a particular entity, which is where $links comes in:

    http://server/service.svc/Blogs(1)/$links/Posts

    This tells the Data Service to return links – aka urls – for all the Posts related to Blog 1.

    $metadata

    If you need to know what model an OData compliant Data Service exposes, you can do this by going to the root of the service and appending $metadata like this:

    http://server/service.svc/$metadata

    This should return an EDMX file containing the conceptual model (aka EDM) exposed by the Data Service.

  • 相关阅读:
    Cable master--hdu1551(二分法)
    Pie--hdu1969(二分法)
    Ice_cream's world I--hdu2120
    How Many Tables--hdu1213(并查集)
    畅通工程--hdu1232(并查集)
    小希的迷宫--hdu1272(并查集)
    More is better--hdu1856(并查集)
    Windows Message Queue--hdu1509
    期末考试--nyoj-757
    网络开发之使用Web Service和使用WCF服务
  • 原文地址:https://www.cnblogs.com/firstcsharp/p/5404194.html
Copyright © 2020-2023  润新知