是的,这些数据都存储在属性的元数据中(SDK 文章)。您必须检索实体的实体元数据,然后在列表中找到该属性。然后将该属性转换为 PicklistAttributeMetadata 对象,它将包含一个选项列表。我会提到,通常从 CRM 中检索元数据是一项昂贵的操作,因此请考虑缓存。
private static OptionSetMetadata RetrieveOptionSet(IOrganizationService orgService,
string entityName, string attributeName)
{
var entityResponse = (RetrieveEntityResponse)orgService.Execute(
new RetrieveEntityRequest
{ LogicalName = entityName, EntityFilters = EntityFilters.Attributes });
var entityMetadata = entityResponse.EntityMetadata;
for (int i = 0; i < entityMetadata.Attributes.Length; i++)
{
if (attributeName.Equals(entityMetadata.Attributes[i].LogicalName))
{
if (entityMetadata.Attributes[i].AttributeType.Value ==
AttributeTypeCode.Picklist)
{
var attributeMD = (PicklistAttributeMetadata)
entityMetadata.Attributes[i];
return attributeMD.OptionSet;
}
}
}
return null;
}
以下是如何使用上述调用将选项写入控制台。
var optionSetMD = RetrieveOptionSet(orgService, "account", "accountcategorycode");
var options = optionSetMD.Options;
for (int i = 0; i < options.Count; i++)
{
Console.WriteLine("Local Label: {0}. Value: {1}",
options[i].Label.UserLocalizedLabel.Label,
options[i].Value.HasValue ? options[i].Value.Value.ToString() : "null");
}
我相信这也适用于全局选项集属性,但如果您知道它是一个全局选项集,那么会有一条不同的消息可能会更有效(SDK 文章)。