我有76個用戶和UserGroups表的用戶表。如何限制來自OData請求的數據量?
使用MVC,OData的,通用的存儲庫和EF,我想濾波基於當用戶組來優化數據檢索:
/api/Users?$filter=USERGROUPS/any(usergroup: usergroup/ID eq 'Group1')
在客戶端,我得到用戶的權數 - 71(因爲OData是基於結果進行篩選),但是我想限制從實際查詢返回的記錄數 - 即。我不想返回所有記錄,然後過濾(對於非常大的數據集不是最佳的)。
我的API控制方法如下:
實體框架需要基礎上, 要求建立動態查詢的護理:
[Queryable(AllowedQueryOptions = AllowedQueryOptions.All)] public IQueryable<USER> Get() { var unitOfWork = new ATMS.Repository.UnitOfWork(_dbContext); var users = unitOfWork.Repository<USER>() .Query() .Include(u => u.USERGROUPS) .Get() .OrderBy(order => order.USERNAME); unitOfWork.Save(); // includes Dispose() return users.AsQueryable(); }
我this post讀取。
但是,使用SQL Server事件探查器,執行的查詢是請求所有記錄,而不是過濾的查詢。
向查詢中添加一個.Take()函數並不能達到理想的結果,因爲我們還需要爲分頁目的返回的實際記錄數。
我正在考慮通過ODataQueryOptions來抓取一些屬性,但這看起來不太正確。
我的工作單位和存儲庫的實現與我正在努力完成的工作有關嗎?如果是的話,這個問題怎麼解決?
我看到這是如何工作的,併爲下一組數據提供了url,但是,在查看SQL Profiler時,所有請求都是針對所有數據的。也許如果有人可以解釋這個機制,以及如何不是所有的數據被返回然後過濾? – ElHaix
好的,但是對於您發佈的代碼,options.ApplyTo()括號內的代碼存在問題:參數類型'System.Linq.IOrderedEnumerable'不能分配給參數類型'System .Linq.IQueryable」。添加.AsQueryable);在OrderBy的最後修復它,但仍然返回類型不正確。 –
ElHaix
另外,除此之外,假設我們只從數據庫中獲得10條記錄,是否有後續調用或部分調用來檢索記錄總數? – ElHaix