2013-10-28 83 views
2

我可以利用沒有EF的OData的功能嗎?帶存儲過程的Web API OData

我正在使用現有的數據庫並使用存儲過程創建我的模型以從數據庫中檢索。如果使用$filter例如使用帶有EF的OData - 過濾器將應用於DB層。

它現在的工作方式是所有結果都從數據庫中取回,然後才應用過濾器。

由於處理時間和服務器負載都浪費了這種方式,我想知道如何對其進行自定義,以便只返回我需要的結果。

也許使用EF會更容易?

數據庫非常複雜 - 大多數模型對象是使用連接從許多不同的表構建的。

回答

3

您可以使用實體框架導入您的存儲過程,然後使用Web API OData ODataController/EntitySetController基於這些存儲過程的實體。

+0

感謝您的大方向,我會研究它。 你能指點我關於這個的任何文檔嗎? – thedude

+2

當然這裏有一個教程:http://www.codeproject.com/Articles/522611/Entity-Framework-CRUD-Operations-Using-Stored-Proc – eoghank

+0

謝謝!該鏈接非常有幫助 – thedude

3

這個回覆更多的是關於過濾以及它如何在引擎蓋下工作,這可能對某人有益。

你說:

現在的工作方式是,所有結果從DB 帶回來,然後才應用過濾器。

實際上有兩種方法可以從OData中獲取數據(我已經遇到過)。一個是讓數據庫服務器返回所有數據,然後過濾(非常低效 - 我相信這就是你所指的)。第二個是通過EF傳遞OData參數以在數據庫級別進行過濾。對於分頁這樣的事情,框架將返回總數的記錄(兩個查詢)。

例如,要顯示屬於特定組的用戶列表,經過濾的數據請求,看起來像:

url: "/api/Users?$filter=USERGROUPS/any(usergroup: usergroup/ID eq '" + groupData.ID + "')" 

要確保什麼是,OData的選項應用到您的EF數據庫上下文,並可以做如下:

public IEnumerable<USER> Get(ODataQueryOptions<USER> options) 
{ 
    var unitOfWork = new ATMS.Repository.UnitOfWork(_dbContext); 

    var users = options.ApplyTo(unitOfWork.Repository<USER>().Queryable 
              .Include(u => u.USERGROUPS) 
              .OrderBy(order => order.USERNAME)) 
              .Cast<USER>().ToList(); 

    unitOfWork.Save();  // includes Dispose() 

    return users; 
} 

望着返回的數據:

enter image description here

對於您的情況,您可以用EF創建的sproc實體替換USER實體。我相信它通過EDMX界面將這些視爲「複雜的物體」,但無法確定。