没有实体框架的Web Api和Odata

时间:2012-11-19 17:51:06

标签: asp.net-web-api odata

当底层数据不是来自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版本)

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

我想这个问题是由稳定排序引起的,这对底层查询提供程序不起作用。你能把错误的调用堆栈确认吗?

此版本中OData查询组成的一个重大变化是它确保在获取热门项目之前的稳定排序。这样做的原因是用户可能有随机数据源,这使得返回数据不断变化。

web api odata包的方式是在执行top之前添加OrderyBy [Keys]查询。或者,如果模型中没有定义键(键是ID,EntityID或[Key]属性),它将使用模型中的所有原始属性进行排序。

如果您可以确保数据源始终以稳定的顺序返回数据,则可以通过代码关闭此功能:

[Queryable(EnsureStableOrdering = false)]