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

如何使用生成的OData V4客户端连接Dynamics 365 OData服务?

解决Dynamics 365 OData V4客户端上下文创建与LINQ查询问题

我之前用这个代码生成器的时候也碰到过一模一样的困惑——生成的代码能编译,但完全不知道怎么搭起查询的“入口”。其实答案就在生成的代码里,只是藏得有点深,我来一步步给你理清楚:

1. 找到自动生成的上下文类

代码生成器会根据Dynamics 365的元数据,自动生成一个继承自DataServiceContext的上下文类,名字通常和你的服务名称对应,比如如果你的Dynamics实例服务端点是https://yourorg.crm.dynamics.com/api/data/v9.2/,生成的类可能叫YourOrgContext或者类似的命名。你可以在生成的代码文件里搜DataServiceContext,很快就能找到它。

2. 初始化上下文并配置认证

Dynamics 365的OData服务需要OAuth认证,所以初始化上下文的时候得带上有效的访问令牌。这里给你一个实用的示例:

// 首先获取Dynamics 365的访问令牌(用Microsoft.Identity.Client库实现)
var clientId = "你的应用注册Client ID";
var tenantId = "你的租户ID";
var dynamicsUrl = "https://yourorg.crm.dynamics.com/api/data/v9.2/";

var app = PublicClientApplicationBuilder.Create(clientId)
    .WithAuthority($"https://login.microsoftonline.com/{tenantId}")
    .Build();

var scopes = new[] { $"{dynamicsUrl}.default" };
var result = await app.AcquireTokenInteractive(scopes).ExecuteAsync();

// 初始化上下文
var context = new YourOrgContext(new Uri(dynamicsUrl));
context.SendingRequest2 += (sender, e) =>
{
    e.RequestMessage.SetHeader("Authorization", $"Bearer {result.AccessToken}");
};

3. 用上下文执行LINQ查询

上下文初始化好之后,就可以直接用LINQ查询实体了,比如查询账户实体:

// 查询所有名称包含"Contoso"的账户
var contosoAccounts = await context.AccountSet
    .Where(a => a.Name.Contains("Contoso"))
    .Select(a => new { a.AccountId, a.Name })
    .ToListAsync();

// 遍历结果
foreach (var account in contosoAccounts)
{
    Console.WriteLine($"账户ID: {account.AccountId}, 名称: {account.Name}");
}

几个关键注意点

  • 生成的上下文里,每个实体集都对应一个属性,比如账户是AccountSet,联系人是ContactSet,都是以实体逻辑名加Set结尾。
  • 记得设置合适的MergeOption,比如context.MergeOption = MergeOption.OverwriteChanges;,避免数据冲突。
  • 如果是后台服务,不要用交互式令牌获取,改用客户端凭据模式(AcquireTokenForClient)更合适。

内容的提问来源于stack exchange,提问作者kor_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:28:46