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

Mr *_*hey 5 c# crm dynamics-crm dynamics-crm-2013

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

aBillingFrequencyCode = new OptionSetValue(myContract.BillingFrequencyCode.Value).ToString();
Run Code Online (Sandbox Code Playgroud)

但输出只是

Microsoft.Xrm.Sdk.OptionSetValue
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Nic*_*now 20

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

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

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

//This method will return the label for the LCID of the account the IOrganizationService is using
public static string GetOptionSetValueLabel(string entityName, string fieldName, int optionSetValue, IOrganizationService service)
{
    var attReq = new RetrieveAttributeRequest();
    attReq.EntityLogicalName = entityName;
    attReq.LogicalName = fieldName;
    attReq.RetrieveAsIfPublished = true;

    var attResponse = (RetrieveAttributeResponse)service.Execute(attReq);
    var attMetadata = (EnumAttributeMetadata)attResponse.AttributeMetadata;

    return attMetadata.OptionSet.Options.Where(x => x.Value == optionSetValue).FirstOrDefault().Label.UserLocalizedLabel.Label;
}

//This method will return the label for the specified LCID
public static string GetOptionSetValueLabel(string entityName, string fieldName, int optionSetValue, int lcid, IOrganizationService service)
{
    var attReq = new RetrieveAttributeRequest();
    attReq.EntityLogicalName = entityName;
    attReq.LogicalName = fieldName;
    attReq.RetrieveAsIfPublished = true;

    var attResponse = (RetrieveAttributeResponse)service.Execute(attReq);
    var attMetadata = (EnumAttributeMetadata)attResponse.AttributeMetadata;

    return attMetadata.OptionSet.Options.Where(x => x.Value == optionSetValue).FirstOrDefault().Label.LocalizedLabels.Where(l => l.LanguageCode == lcid).FirstOrDefault().Label;
}        
Run Code Online (Sandbox Code Playgroud)

  • 我已经看到使用`entity.FormattedValues ["optionSet"]`来获取所选选项的标签的示例.由于我看到更多的人使用请求服务来检索这些数据,我认为这可能是它应该做的方式,但我只是想知道,有什么区别? (3认同)
  • 如果要使用 FormattedAttributes 选项,您必须了解实体的来源。如果您使用组织服务检索实体,您将在那里找到您的值,如果它是从插件执行上下文检索的目标,则您的 FormattedValue 将不存在。如果它是 PreImage/PostImage,它将类似于从组织服务检索的记录。 (2认同)

Gui*_*ite 7

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

这是一个例子:

public static string GetoptionsetText(string entityName, string attributeName, int optionSetValue, IOrganizationService service)
{
    string AttributeName = attributeName;
    string EntityLogicalName = entityName;
    RetrieveEntityRequest retrieveDetails = new RetrieveEntityRequest
    {
        EntityFilters = EntityFilters.All,
        LogicalName = EntityLogicalName
    };
    RetrieveEntityResponse retrieveEntityResponseObj = (RetrieveEntityResponse)service.Execute(retrieveDetails);
    Microsoft.Xrm.Sdk.Metadata.EntityMetadata metadata = retrieveEntityResponseObj.EntityMetadata;
    Microsoft.Xrm.Sdk.Metadata.PicklistAttributeMetadata picklistMetadata = metadata.Attributes.FirstOrDefault(attribute => String.Equals(attribute.LogicalName, attributeName, StringComparison.OrdinalIgnoreCase)) as Microsoft.Xrm.Sdk.Metadata.PicklistAttributeMetadata;
    Microsoft.Xrm.Sdk.Metadata.OptionSetMetadata options = picklistMetadata.OptionSet;
    IList<OptionMetadata> OptionsList = (from o in options.Options
                                            where o.Value.Value == optionSetValue
                                            select o).ToList();
    string optionsetLabel = (OptionsList.First()).Label.UserLocalizedLabel.Label;
    return optionsetLabel;
}
Run Code Online (Sandbox Code Playgroud)