You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中使用NextLink消费OData V1端点?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:01:00