2014-09-30 148 views
0

我有一個Web API從SQL存儲過程公開ODATA。我想使用像/ odata/firmhierarchy(225)這樣的url來傳遞225到存儲過程的參數中。它只是告訴我它找不到匹配的資源。它擊中控制器,只是跳過該方法。思考?OData Web API路由

在webapiconfig

 private static IEdmModel GenerateEdmModel() 
    { 
     var builder = new ODataConventionModelBuilder(); 
     builder.EntitySet<Employee>("Employees"); 
     builder.EntitySet<Employee>("FirmHierarchy"); 

     return builder.GetEdmModel(); 
    } 

語境:

public virtual ObjectResult<Employee> sp_EmployeeHierarchy(Nullable<int> managerEmpID) 
    { 
     var managerEmpIDParameter = managerEmpID.HasValue ? 
      new SqlParameter("ManagerEmpID", managerEmpID) : 
      new SqlParameter("ManagerEmpID", 0); 

     return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<Employee>("sp_EmployeeHierarchy @ManagerEmpID", managerEmpIDParameter); 
    } 

控制器中唯一的方法:

[Queryable] 
    public IQueryable<Employee> GetFirmHierarchy() 
    { 
     return db.sp_EmployeeHierarchy(225).AsQueryable(); 
     //return SingleResult.Create(db.Employees.Where(employee => employee.EmpId == key)); 
    } 
+0

難道你不能從請求URL傳遞225到控制器方法嗎? – 2014-10-09 10:53:26

+0

是的,這是我的問題。我把桌子放了下來,把桌子弄平了,然後就這樣做了。但我想知道如何用一個參數來調用sp,並用odata傳遞它。 – Jman 2014-10-10 12:30:52

回答

0

這應該工作:

1.Write另一種方法在你的控制器:

[EnableQuery] 
public IQueryable<Employee> Get([FromODataUri] int key) 
{ 
    return db.sp_EmployeeHierarchy(key).AsQueryable(); 
} 

請注意,[EnableQuery]是Web API的OData爲V4引入了一個屬性。如果您仍在使用OData V1-3的Web API,請仍使用[Queryable]

2.然後,您可以發送請求

GET /odata/firmhierarchy(225) 

,並獲得員工。

0

當從實體框架自動生成時,我能夠使ODATA爲表工作。然而,那個生成過程並不想爲表值函數(與SP類似的情況)返回的複雜類型工作,因爲它似乎無法理解關鍵所在。

我發現我可以讓它工作。首先,我查看這article。他設置了一些更多的手動,他的獲取公司公司處理控制器結束爲id 3的路由爲「http://localhost:10020/odata/companyprocessing(3)」。

這讓我感到驚訝。我的其他生成的類設置SomeEntity成爲SomeEntityController的模式,使用像GetSomeEntities這樣的方法,以及在我看來與該方法相匹配的路由,但是丟棄單詞get。因此,從Get方法名稱中刪除實體名稱看起來不同,但它工作。證明該路徑實際上與控制器名稱匹配,而不是方法名稱。

在這種情況下,您可以使用您查詢的數據類型和控制器名稱的開頭來配置路由。然後,實際路徑也使用控制器名稱的開頭。

然後這一切只是給我們帶來本質上的其它解決方案公佈,假設你的控制器名稱firmhierarchy控制器

所以,現在,這個決策意識...嘗試去http://localhost:55063/odata/ $元,您的港口可能有所不同。您會注意到ODATA公開了一個數據類型,該數據類型通過數據集訪問。當客戶端試圖查詢到ODATA時,他們正在嘗試對DataSet進行查詢,獲取DataType的項目。

與控制器名稱(更少控制器)匹配的DataSet和Get方法實際上可以在沒有進一步擴展名稱的情況下獲得 - 否則在這種情況下會給我帶來問題。