如何在C#中使用NextLink消费OData V1端点?
$inlinecount报错的问题 你遇到的核心问题是OData V1协议不支持$inlinecount参数,但你的ODataClient默认启用了请求总条数的功能,导致自动追加这个参数触发了服务端的错误。下面是具体的解决思路和代码示例:
1. 关闭自动请求总条数的设置
ODataClient的IncludeTotalCount()方法(或是某些默认配置)会自动在请求中添加$inlinecount=allpages参数,而这是OData V1不支持的。你需要确保查询没有调用这个方法,或是在上下文配置中禁用该行为:
// 避免调用IncludeTotalCount(),不要写成 context.Lines.IncludeTotalCount() var linesQuery = context.Lines;
如果是通过配置项控制,检查你的ODataClient初始化代码,确保没有开启自动获取总数的开关。
2. 手动基于NextLink实现分页
OData V1的分页是通过响应中的next链接实现的,你需要手动循环获取数据,直到没有NextLink为止。示例代码如下:
var context = new YourODataContext(new Uri("http://example.com/DynamicsAx/Services/OData/")); // 强制使用V1协议,避免客户端自动添加V2+特性 context.MaxProtocolVersion = DataServiceProtocolVersion.V1; var allLines = new List<Line>(); DataServiceQuery<Line> currentQuery = context.Lines; do { // 执行当前页查询 var pageResults = await currentQuery.ExecuteAsync(); allLines.AddRange(pageResults); // 获取下一页的延续链接 var continuation = pageResults.GetContinuation(); currentQuery = continuation != null ? context.CreateQuery<Line>(continuation.NextLinkUri) : null; } while (currentQuery != null); // allLines现在包含所有分页的数据
这段代码的核心是用GetContinuation()获取响应中的NextLink,再基于这个Uri创建新的查询,循环执行直到没有下一页。
3. 强制客户端使用V1协议
初始化DataServiceContext时,设置MaxProtocolVersion为V1,能让客户端严格遵循OData V1规范,避免自动生成V2及以上版本才支持的参数:
context.MaxProtocolVersion = DataServiceProtocolVersion.V1;
错误原因说明
OData V1的规范里并没有定义$inlinecount参数,这个参数是从OData V2才引入的。你的服务端已经明确设置了MaxProtocolVersion.V1,所以收到包含$inlinecount的请求时,就会返回"Row counts cannot be requested..."的错误。而你的ODataClient默认可能开启了获取总条数的功能,因此自动在请求中添加了这个不被支持的参数。
内容的提问来源于stack exchange,提问作者Jeppe

