2016-02-29 74 views
2

我們使用ASP.Net Webapi與OData和Dapper作爲ORM。對於GET請求,我們分別使用options參數對象的filter參數爲Dapper查詢構建SQL字符串。這很適合列eq值等WebApi與Odata-V4和Dapper - Serverside過濾

但現在我想做一些服務器端分頁。這意味着我用兩個過濾器($ top和$ skip)發出請求。例如。 「https://api.server.com/Orders?$跳過= 100 & $頂部= 50。短小精悍,使正確的請求到數據庫,我得到一個包含50個條目從短小精悍的響應結果。

然後我把這個結果到的WebAPI的return語句控制器和的WebAPI似乎做自己的過濾,所以它執行從50由此導致0項跳過100。

有沒有人有同樣的問題,並找到了一種方法,以防止濾波的WebAPI但是將篩選委託給ORM?編寫ApiControllers而不是ODataControllers是無可替代的,因爲我非常喜歡使用odata語法進行篩選。感謝您的回答!

+0

希望能看到你是如何使用option參數爲Dapper構建SQL字符串。 –

+0

您可以從ODataQueryOptions.Filter.FilterClause.Expression獲取頂級SingleValueNode,這可以作爲樹提取。最簡單的方法是用調試器查看它。 – Hejo

回答

0

我們在下面的代碼片段的方式固定它,這提供瞭解決方案,放棄在[EnableQuery]屬性:

public async Task<IHttpActionResult> Get(ODataQueryOptions<vwABC> options) 
    { 
     if(options != null && options.SelectExpand != null) 
     { 
      options.Request.ODataProperties().SelectExpandClause = options.SelectExpand.SelectExpandClause; 
     } 
     if(options != null && options.Count != null && options.Count.Value == true) 
     { 
      options.Request.ODataProperties().TotalCount = await base.GetCount("vwABC", options); 
     } 
     return await base.Get(options, "vwABC"); 
    } 
2

假設您的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 
} 
+0

謝謝您的回覆。我的返回參數是一個IHttpActionResult,但它也適用於我刪除[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]屬性。其他方面是我想使用webapi的$ select功能,所以看起來我必須寫兩個Get方法。 – Hejo