2012-11-19 103 views
3

當基礎數據不是來自實體框架時,我無法使OData與Asp.Net Web Api一起工作。Web Api和Odata without Entity Framework

我使用的是最新的OData NuGet包(Microsoft ASP.NET Web API OData 0.2.0-alpha release),但是當我試圖傳遞一個OData的查詢(比如$top=10)我收到錯誤:

The given key was not present in the dictionary

如果我不發送的OData查詢我可以調用方法就好了。使用實體框架的同一個Web Api項目中的其他方法可以很好地與OData查詢配合使用。那些不起作用的是使用Subsonic ORM查詢底層的AS400數據源。它返回一個IQueryable。在VS 2012和.NET 4.5 RTM發佈並將OData移植到單獨的包之前,這一切都很好。 (即使用VS2012和.NET 4.5的beta和RC版本)

任何想法,將不勝感激。

+0

可以添加一個堆棧跟蹤?我會試着去看看。 –

回答

1

我想這個問題是由穩定的排序引起的,這對底層查詢提供程序不起作用。你可以把錯誤的調用堆棧來確認它嗎?

此版本中OData查詢組合的一個重大變化是,它確保在採用頂級項目之前的穩定排序。這樣做的原因是用戶可能有隨機數據源,這使得返回數據不斷變化。

web api odata包的做法是在執行top之前添加OrderyBy [Keys]查詢。或者,如果在模型中沒有定義鍵(鍵是ID,EntityID或[Key]歸屬屬性),它將使用模型中的所有基元屬性進行排序。

如果你能確保數據源將始終以穩定的排序返回數據,您可以通過代碼關閉這個功能:

[Queryable(EnsureStableOrdering = false)]