当底层数据不是来自Entity Framework时,我无法让OData与Asp.Net Web Api一起使用。
我正在使用最新的OData Nuget包(Microsoft ASP.NET Web API OData 0.2.0-alpha release
)但是当我尝试传递OData查询(比如$top=10
)时,我收到错误:
字典中没有给定的密钥
如果我不发送OData查询,我可以调用该方法。使用Entity Framework的同一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)]