C# 如何使用CRM sdk和C从CRM 2011中实体的字段中获取选项集#

C# 如何使用CRM sdk和C从CRM 2011中实体的字段中获取选项集#,c#,dynamics-crm-2011,crm,C#,Dynamics Crm 2011,Crm,如何使用CRM sdk和C#从CRM 2011中实体的字段中获取选项集?我只想和大家分享一种直接获取实体中字段选项集的方法 此方法需要实体名称、包含选项集和实例化的IOOrganizationService的字段名称 using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; using Microsoft.Xrm.Sdk.Metadata; public void GetOptionSet(string entityName,

如何使用CRM sdk和C#从CRM 2011中实体的字段中获取选项集?我只想和大家分享一种直接获取实体中字段选项集的方法

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

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

            }
参考资料:


我希望这能帮助你们中的一些人完成你们的项目。

嘿,为什么不使用这个呢

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

在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();


    }

这取决于它是本地的还是全球的。如果是本地的,则:

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;

假设您已经声明了IorganizationService

有两种方法可以获取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));

由于您只需要可用值,而不需要检索所有实体元数据,因此检索的信息可能太多。这将为您提供字段的整数值。它不会给你一个可能的值及其相关标签的列表,这是原始问题所述的要求。但我看到的问题是:如何从实体中的字段获取选项集:P他没有要求可能的值列表及其相关标签:/@Dot_Net Pro-当我编码“Contact”时我没有得到你上面的“属性”属性。我需要添加什么才能使用您的代码?@DeveloperM我有
实体联系人=新实体()
实体具有属性属性。
@Dot\u Net Pro:抱歉-我被文本的颜色吓坏了-以为您的“联系人”是实体名称,而不是联系人实体的实例。谢谢@Nicknow。我得说,这比我的代码更有效。这就是我喜欢的,所以,有些人总是可以分享一个更好的方法来帮助彼此提高编码标准。他们的方法是获得所有选项集的一种方法吗?
newSalesOrder[attributeName] = new OptionSetValue(Convert.ToInt32(optionValue));