web api 2 学习笔记 (Odata ODataQueryOptions 使用)

[ODataRoutePrefix("products")]
public class ProductController : BaseController
{
    [ODataRoute("")]
    [EnableQuery(AllowedQueryOptions = Helper.ALLOW_QUERY | AllowedQueryOptions.Expand, MaxExpansionDepth = 5)]
    public IHttpActionResult get(ODataQueryOptions<Product> queryOptions)
    {
        var url = "http://localhost:59853/api/products";
        var query = S.ParseQueryString("");
        query["$filter"] = "Id ge 2";
        url += "?" + query.toQueryString();
        var req = new HttpRequestMessage(HttpMethod.Get, url); //创建一个 请求 url + queryString 
        var myQueryOptions = new ODataQueryOptions(queryOptions.Context, req); 创建 ODataQueryOptions with request + EDM (这里我们使用原本的content EDM)
        var queryable = myQueryOptions.ApplyTo(db.products) as IQueryable<Product>; //调用 ApplyTo,它就会对这个query进行处理然后返回一个新的query. 在controller里我们需要强转. 
        return Ok(queryable);
    }             
}

ODataQueryOptions 是让前段可以使用 $filter,$select 等来操控数据 

它是配合整个请求来使用的。

上面看看我们在后台生产一个 ODataQueryOptions 的过程和使用它. 

这东西不常用到。

我遇到的情况是如果要做一些权限,比如 $expand=colors , 而colors 有一些是当前用户不能访问的,那么我们可能需要增加一个filter $expand=colors($filter=OwnerId = 5) 假设当前用户 Id 是5. 

 

也可以让 EnableQueryAttribute 在 ApplyQuery 是调用

public class MyEnableQueryAttribute : EnableQueryAttribute
{
    public override IQueryable ApplyQuery(IQueryable queryable, ODataQueryOptions queryOptions)
    {    
        //var url = "http://localhost:59853/api/products";
        //var query = S.ParseQueryString("");
        //query["$filter"] = "Id ge 2";
        //url += "?" + query.toQueryString();
        //var req = new HttpRequestMessage(HttpMethod.Get, url);
        //var queryOptionsTwo = new ODataQueryOptions(queryOptions.Context, req);
        //queryable = queryOptionsTwo.ApplyTo(queryable);
        return queryOptions.ApplyTo(queryable);
    }
}

 

转载于:https://www.cnblogs.com/keatkeat/p/5389957.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值