Home » C# » Dynamics CRM dataverse – how to get a list of OptionSet values in C#

Dynamics CRM dataverse – how to get a list of OptionSet values in C#

By Emily

I’ve been working on a website that uses data from a cloud based Dynamics 365 CRM system lately, and one of the requirements involved us building an edit form for one of the entities. This particular entity had 3 different statuses – draft, active, cancelled and we needed to give the user a dropdown so that they could select the appropriate option. We needed to find out how to dynamically retrieve the OptionSet values in C# to populate our dropdown control. It was surprisingly difficult to find the answer although the solution is fairly straightforward. Hopefully by sharing the solution here I can save you the time it took me to find the answer.

OptionSet C# – use RetrieveAttributeRequest to get metadata

Sure we could have created a static list of values, but that would be a terrible idea. If the underlying values were updated, added, or removed then our website wouldn’t reflect those changes.

In your C# code, use RetrieveAttributeRequest and RetriveAttributeResponse. We can then use the AttributeMetaData returned, which in turn contains a list of OptionSet values.

 private async Task<List<OptionSetDTO>> GetOptionSetData(string entityName, string propertyName)
  {
   var attributeRequest = new RetrieveAttributeRequest
   {
     EntityLogicalName = entityName,
     LogicalName = propertyName,
     RetrieveAsIfPublished = false
   };

   RetrieveAttributeResponse response = (await 	GetOrganizationService()).Execute(attributeRequest) as RetrieveAttributeResponse;
	
   EnumAttributeMetadata attributeData = (EnumAttributeMetadata)response.AttributeMetadata;

   var optionList = (from option in attributeData.OptionSet.Options
                     select new OptionSetDTO(
                       option.Value,
                       option.Label.UserLocalizedLabel.Label))
     .ToList();
	return optionList;
 }

Map the data to build the C# OptionSet objects

You’ll notice I map the option values into a simple object called OptionSetDTO, and that looks like this:

public class OptionSetDTO
{
  public OptionSetDTO(int? _value, string _name)
  {
    Value = _value;
    Name = _name;
  }
  public int? Value { get; set; }
  public string Name { get; set; }
}

That reusable method can be used like this to return a List of options:

List<OptionSetDTO> optionList = await GetOptionSetData("entityName", "propertyName");

The list of options returned then looks like this:

    {
      "value": 174640001,
      "name": "Draft"
    },
    {
      "value": 174640002,
      "name": "Active"
    },
    {
      "value": 174640003,
      "name": "Cancelled"
    }

…. and this can be used to populate a dropdown control.