我们将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
}