Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从CRM插件中的OptionSetValue获取字符串值_C#_Dynamics Crm_Crm_Dynamics Crm 2013 - Fatal编程技术网

C# 从CRM插件中的OptionSetValue获取字符串值

C# 从CRM插件中的OptionSetValue获取字符串值,c#,dynamics-crm,crm,dynamics-crm-2013,C#,Dynamics Crm,Crm,Dynamics Crm 2013,我想知道如何在我正在制作的CRM插件中获取OptionSet的字符串值。我以为我所要做的就是将int值传递给OptionSetValue,但这似乎不起作用。这是我的密码: aBillingFrequencyCode=newoptionsetvalue(myContract.BillingFrequencyCode.Value).ToString(); 但产出只是一个小问题 Microsoft.Xrm.Sdk.options设置值 有什么想法吗?为了获得OptionSet文本值,您需要查询元数

我想知道如何在我正在制作的CRM插件中获取OptionSet的字符串值。我以为我所要做的就是将int值传递给OptionSetValue,但这似乎不起作用。这是我的密码:

aBillingFrequencyCode=newoptionsetvalue(myContract.BillingFrequencyCode.Value).ToString();
但产出只是一个小问题

Microsoft.Xrm.Sdk.options设置值

有什么想法吗?

为了获得OptionSet文本值,您需要查询元数据(这是因为Dynamics CRM支持多种语言)

这里有一个例子:

公共静态字符串GetoptionsetText(字符串entityName、字符串attributeName、int optionSetValue、IOOrganizationService)
{
字符串AttributeName=AttributeName;
字符串EntityLogicalName=entityName;
RetrieveEntityRequest retrieveDetails=新RetrieveEntityRequest
{
EntityFilters=EntityFilters.All,
LogicalName=EntityLogicalName
};
RetrieveEntityResponse retrieveEntityResponseObj=(RetrieveEntityResponse)服务。执行(retrieveDetails);
Microsoft.Xrm.Sdk.Metadata.EntityMetadata=retrieveEntityResponseObj.EntityMetadata;
Microsoft.Xrm.Sdk.Metadata.PicklistAttributeMetadata=Metadata.Attributes.FirstOrDefault(属性=>String.Equals(属性.LogicalName,属性名,字符串比较.OrdinalIgnoreCase))作为Microsoft.Xrm.Sdk.Metadata.PicklistAttributeMetadata;
Microsoft.Xrm.Sdk.Metadata.OptionSetMetadata options=picklistMetadata.OptionSet;
IList OptionsList=(来自options.options中的o
其中o.Value.Value==选项设置值
选择o.ToList();
字符串optionsetLabel=(optionList.First()).Label.UserLocalizedLabel.Label;
返回选项设置标签;
}

您可以检索OptionSet标签,而无需检索实体的所有元数据。我提供了两种方法。您将使用运行IOOrganizationService的帐户的语言代码(LCID)。另一个允许您指定LCID

注意,如果要在代码中广泛使用这些代码,您可能需要考虑缓存值以提高性能-这将取决于特定的应用程序要求。

如果计划同时为单个实体上的多个选项集检索这些值,则应使用上面的Guido代码,并在一次调用中检索所有实体元数据,以减少对CRM的调用次数。因此,在某些情况下,我们的每个代码片段都更有效

//此方法将返回IOOrganizationService正在使用的帐户的LCID标签
公共静态字符串GetOptionSetValueLabel(字符串entityName、字符串fieldName、int optionSetValue、IOOrganizationService)
{
var attReq=新的RetrieveAttributeRequest();
attReq.EntityLogicalName=entityName;
attReq.LogicalName=字段名;
attReq.RetrieveAsIfPublished=true;
var attResponse=(RetrieveAttributeResponse)service.Execute(attReq);
var attMetadata=(EnumAttributeMetadata)attResponse.AttributeMetadata;
返回attMetadata.OptionSet.Options.Where(x=>x.Value==optionSetValue).FirstOrDefault().Label.UserLocalizedLabel;
}
//此方法将返回指定LCID的标签
公共静态字符串GetOptionSetValueLabel(字符串entityName、字符串fieldName、int optionSetValue、int lcid、IOrganizationService服务)
{
var attReq=新的RetrieveAttributeRequest();
attReq.EntityLogicalName=entityName;
attReq.LogicalName=字段名;
attReq.RetrieveAsIfPublished=true;
var attResponse=(RetrieveAttributeResponse)service.Execute(attReq);
var attMetadata=(EnumAttributeMetadata)attResponse.AttributeMetadata;
返回attMetadata.OptionSet.Options.Where(x=>x.Value==optionSetValue).FirstOrDefault().Label.LocalizedLabels.Where(l=>l.LanguageCode==lcid).FirstOrDefault().Label;
}        

我见过使用
entity.FormattedValues[“optionstart”]
获取所选选项标签的示例。由于我看到越来越多的人使用请求服务来检索这些数据,我想这可能是应该采用的方式,但我只是想知道,有什么区别?如果您是一个实体,您可以使用
entity.FormattedValues[“optionSet”]
来获取该特定记录的optionSet值的选项集标签。您的问题更一般地理解为如何获取特定选项集值的标签-不特定于实体记录-这就是我发布代码的原因。我不是OP,我对最佳实践很好奇。如果您想使用FormattedAttributes选项,您必须知道实体的来源。如果您使用Organization service检索实体,您将在那里找到您的值,如果它是从插件执行上下文检索到的目标,您的FormattedValue将不存在。如果是前映像/后映像,则其行为类似于从组织服务检索的记录。