带有Odata-V4和Dapper的WebApi-服务器端过滤

我们将ASP.Net Webapi与OData和Dapper用作ORM.对于GET请求,我们分别使用options参数对象和它的filter参数来为Dapper查询构建SQL String.这适用于列eq值等.

但是现在我想做一些服务器端分页.这意味着我使用两个过滤器($top和$skip)发出请求.例如. “ https://api.server.com/Orders?$skip = 100& $top =50.Dapper向数据库发出正确的请求,我得到一个包含50个条目的结果,作为dapper的响应.

然后,将结果输入到webapi控制器的return语句中,并且webapi似乎自己进行了过滤.因此它执行从50的结果中跳过100的结果,这将导致0项.

是否有人遇到过同样的问题,并且找到了一种方法来阻止webapi进行过滤,而是将过滤委托给ORM?用ApiControllers代替ODataControllers是别无选择的,因为我真的很喜欢使用odata语法进行过滤.

感谢您的回答!

解决方法:

假设您的API动作的返回类型为IQueryable,则框架将对数据库返回的所有数据应用查询过滤器,因此让查询结果包装到PageResult中并返回它,它将不再再次应用过滤器.示例代码如下-

public PageResult<Orders> GetOrdersPage(ODataQueryOptions<Orders> queryOptions)
{
    // Parse queryOptions to get Top and Skip
    var top = queryOptions.Top.RawValue;
    var skip = queryOptions.Skip.RawValue;

    //Call the dataaccess method and then get Querable result
    var queryResults = dataAccess.GetOrders(top,skip).AsQuerable<Orders>();

    //Return Page result 
    return new PageResult<Orders>(queryResults, new URI("Next page URI"), 1234); //1234 - is total count of records in table
}
上一篇:使用nodejs调用C4C的Odata服务创建销售订单


下一篇:CodeGo.net>我如何传递对象(实体)作为WebApi Odata的参数