对于OData查询,$ filter保证在$ skip之前执行吗?

时间:2012-09-20 23:00:51

标签: .net asp.net-web-api expression odata

如果在$filter操作之前始终应用$skip操作,则无法在OData protocol documentation中找到提及。显然,在实现一致的页面检索算法时这样做是有意义的。

我担心的是表达式树不会强加这样的约束。例如,以下两个查询通常会产生不同的结果。

IQueryable<string> query = (new[] { "aaa", "eee", "bbbb", "cccc", "dddd" }).AsQueryable();

query.Where(arg => arg.Length > 3).Skip(1);
query.Skip(1).Where(arg => arg.Length > 3);

我已经使用OData的ASP.NET Web API RC实现进行了一些简单的测试,它在$filter之前应用$skip,无论运算符出现在查询字符串中的哪个位置。一般来说这是真的吗?

1 个答案:

答案 0 :(得分:2)

MS-ODATA(OData的OSP规范)states:必须评估具有多个查询选项的数据服务URI,就好像查询选项应用于资源标识的资源一样URI的路径部分,按以下顺序排列:$ format,$ inlinecount,$ filter,$ orderby,$ skiptoken,$ skip,$ top,$ expand。

我认为规范中实际上有一两个错误(应该在下一个规范更新中解决) - 我添加了这个评论:$ inlinecount如何在$ filter之前有效,以及$ filter / $ orderby如何才能生效$ expand之前有效吗?

无论如何,您可以假设规范确实订购了系统查询选项,并且它当前必须在规范中,因此声称支持OData的任何服务器都应该在$ skip或$ top之前始终评估$ filter。 / p>