【问题标题】:How to get the option set from a field in an entity in CRM 2011 using crm sdk and C#如何使用 crm sdk 和 C# 从 CRM 2011 中实体中的字段获取选项集
【发布时间】:2014-04-27 13:36:56
【问题描述】:

如何使用 crm sdk 和 C# 从 CRM 2011 中实体的字段中获取选项集?我只是想与你们分享一种在实体中获取字段选项集的直接方法。

【问题讨论】:

标签: c# dynamics-crm-2011 crm


【解决方案1】:

在 Dynamics CRM 中检索元数据信息的正确方法是仅检索所需的信息。我们应该只根据原始问题检索选项集值。当所有要求指定为选项集的值时,检索实体的所有元数据是不必要的,并且会产生不必要的开销。

这是获取选项集选项列表的正确方法。

    public static void GetOptionSet(string entityName, string fieldName, 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;

        var optionList = (from o in attMetadata.OptionSet.Options
            select new {Value = o.Value, Text = o.Label.UserLocalizedLabel.Label}).ToList();


    }

【讨论】:

  • 谢谢@Nicknow。我得说,这比我的代码更好。这就是我喜欢的 SO,有人总是可以分享更好的方法来帮助彼此提高他们的编码标准。
  • 他们是获取所有选项集的方法吗?
【解决方案2】:

此方法需要实体名称、包含选项集的字段名称和实例化的 IOrganizationService。

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Metadata;

    public void GetOptionSet(string entityName, string fieldName, IOrganizationService service)
            {
                RetrieveEntityRequest retrieveDetails = new RetrieveEntityRequest();
                retrieveDetails.EntityFilters = EntityFilters.All;
                retrieveDetails.LogicalName = entityName;

                RetrieveEntityResponse retrieveEntityResponseObj = (RetrieveEntityResponse)service.Execute(retrieveDetails);
                EntityMetadata metadata = retrieveEntityResponseObj.EntityMetadata;
                PicklistAttributeMetadata picklistMetadata = metadata.Attributes.FirstOrDefault(attribute => String.Equals(attribute.LogicalName, fieldName, StringComparison.OrdinalIgnoreCase)) as PicklistAttributeMetadata;
                OptionSetMetadata options = picklistMetadata.OptionSet;
                var optionlist = (from o in options.Options
                                   select new { Value = o.Value, Text = o.Label.UserLocalizedLabel.Label }).ToList();

                //from here you can do anything you want now with the optionlist

            }

参考:
http://guruprasadcrm.blogspot.ae/2011/12/retrieve-optionset-text-in-crm-2011.html

我希望这对你们中的一些人有帮助。

【讨论】:

  • 您检索的信息过多,因为您只需要不需要检索所有实体元数据的可用值。
【解决方案3】:

嘿,为什么不用这个??

OptionSetValue CountryOptionSet = Contact.Attributes.Contains("gr_address2_country") ? Contact["gr_address2_country"] as OptionSetValue : null;
 if (CountryOptionSet != null)
                     string Country = CountryOptionSet.Value.ToString();

【讨论】:

  • 这将为您提供该字段的整数值。它不会为您提供可能的值及其相关标签的列表,这是原始问题所要求的。
  • 但我看到的问题是:如何从实体中的字段获取选项集:P 他没有要求可能的值列表及其相关标签:/
  • @Dot_Net Pro - 当我编码“联系”时。我没有得到您上面的“属性”属性。我需要添加什么才能获得它以便使用您的代码?
  • @DeveloperM 我有Entity Contact = new Entity() Entity have Attributes property.
  • @Dot_Net Pro:对不起 - 我被文本的颜色吓坏了 - 以为你的“联系人”是实体名称,而不是联系人实体的实例。
【解决方案4】:

取决于它是本地的还是全局的。如果是本地的,那么:

string optionsetText = entity.FormattedValues["new_optionset"];

如果它是全局的,那么您需要更多代码:

        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;

我从 Guido 那里得到了另一个类似的问题,但 rcados 缺少第三个参数。获取刚刚设置的文本

var foo = GetoptionsetText("lead", "picklist", 1234 , service)

假设你已经声明了 IorganizationService

【讨论】:

    【解决方案5】:

    有两种方式获取OptionSet的文本:

    第一:

    OptionSetValue opProductType = new OptionSetValue();
    opProductType = (OptionSetValue)item.Attributes[attributeName];
    var optionValue = opProductType.Value;
    

    第二:

    var StatusString = TermAndCon.FormattedValues[attributeName].ToString();
    

    (设置)发布选项集值:

    newSalesOrder[attributeName] = new OptionSetValue(Convert.ToInt32(optionValue));
    

    【讨论】:

      猜你喜欢
      • 2012-07-09
      • 2014-03-12
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多