如何通过 Microsoft Dynamics 的组织服务获取不同语言的 OptionSet 值和 Formatted 值?

How to get via Organisation service for Microsoft Dynamics the OptionSet value and Formatted value in different languages?

我有一个自定义 .NET 应用程序来查询和管理 Microsoft Dynamics CRM 实例上的数据。 此应用程序是多语言的,用户可以通过语言切换更改应用程序的语言。

对于连接和操作,我正在使用 Microsoft.Xrm.Sdk 中的 OrganizationService 和 CRMServiceClient。这与依赖注入相结合,将连接传递给我们不同的 类.

Ninject 这个绑定看起来像 Bind().To().WithConstructArgument("crmConnectionString","连接字符串");

正在 Dynamics 中查询和更新数据,但我们无法以访问者在自定义应用程序中选择的语言检索 OptionSet 值和格式化值。即使我们在调用 Dynamics 之前更改 Thread 的区域性,也始终使用相同的语言。

我们如何将当前语言/文化传递给 OrganizationService,以便它知道必须使用哪种语言来检索字段?

有人告诉我,这是基于用于连接到 CRM 的帐户。因此,如果情况确实如此,那么这意味着如果我们有 5 种语言,我们需要有 5 个连接字符串和 5 个需要调用的 OrgnaizationService 实例。这种情况下应该怎么处理才好呢?

感谢您的回答

我不知道你是否可以将文化传递给 OrganizationService,我认为如果你想走这条路,使用不同的连接字符串是可行的。

但是,您可以查询 CRM 以检索所需选项集的本地化标签,如 here 所述。
总而言之,它使用 RetrieveAttributeRequest,传递实体逻辑名称和字段名称并循环遍历结果以获取标签。

var request = new RetrieveAttributeRequest
{
    EntityLogicalName = "incident",
    LogicalName = "casetypecode"
};
var response = organizationService.Execute(request) as RetrieveAttributeResponse;
var optionSetAttributeMetadata = response.AttributeMetadata as EnumAttributeMetadata;
foreach (var option in optionSetAttributeMetadata.OptionSet.Options)
{
    Console.WriteLine($"Localized labels for option {option.Value}:");
    foreach (var locLabel in option.Label.LocalizedLabels)
    {
        Console.WriteLine($"Language {locLabel.LanguageCode}: {locLabel.Label}");
    }

    Console.WriteLine($"Localized description for option {option.Value}:");
    foreach (var locLabel in option.Description.LocalizedLabels)
    {
        Console.WriteLine($"Language {locLabel.LanguageCode}: {locLabel.Label}");
    }
}

link 中的代码还添加了对已检索值的缓存,这样您每个选项集只查询 CRM 一次。

我实施的解决方案是使用 CallerId。 在返回客户端之前,我用 Guid 填充 CallerId。

Guid 来自在 Dynamics 中配置了特定语言的用户。 根据语言,我选择了不同的用户。