如果在$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
,无论运算符出现在查询字符串中的哪个位置。一般来说这是真的吗?
答案 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>