幾年前寫過一個OptionSetHelper 傳送門,這個OptionSet擴展已經迭代過好幾個版本了,現在把迭代後的版本分享給大家,希望大家喜歡!如果你覺得有用,那就點個關注或者點個贊,感謝!
/* file name:lce.ext.providers.OptionSetExt.cs
* author:lynx [email protected] @ 2019/9/18 9:04:37
* copyright (c) 2019 [email protected]
* desc:
* > add description for OptionSetExt
* revision:
*
*/
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Metadata;
namespace lce.ext.providers
{
/// <summary>
/// action:OptionSetExt
/// </summary>
public static class OptionSetExt
{
/// <summary>
/// 獲取選項集列表 這個效率更高,建議用這個
/// </summary>
/// <param name="service"> </param>
/// <param name="entityName"> </param>
/// <param name="attributeName"></param>
/// <returns></returns>
public static IList<KeyValuePair<string, int>> OptionSet(this IOrganizationService service, string entityName, string attributeName)
{
var request = new RetrieveEntityRequest
{
LogicalName = entityName,
EntityFilters = EntityFilters.Attributes
};
var response = (RetrieveEntityResponse)service.Execute(request);
var entityMetadata = response.EntityMetadata;
var metadata = (PicklistAttributeMetadata)entityMetadata.Attributes.Where(x => x.LogicalName.Equals(attributeName) && x.AttributeType.Value == AttributeTypeCode.Picklist).FirstOrDefault();
if (null != metadata)
{
return metadata.OptionSet.Options.Select(x => new KeyValuePair<string, int>(x.Label.UserLocalizedLabel.Label, x.Value.Value)).ToList();
}
return null;
}
/// <summary>
/// 通過選項值獲取選項描述 這個效率更高,建議用這個 通過OptionsSetExt.EntityMetadata 先獲取EntityMetadata
/// </summary>
/// <param name="entity"> EntityMetadata</param>
/// <param name="attributeName"></param>
/// <param name="optionValue"> </param>
/// <returns></returns>
public static string OptionLabel(this EntityMetadata entity, string attributeName, int optionValue)
{
if (optionValue == -1) return string.Empty;
var metadata = (PicklistAttributeMetadata)entity.Attributes.Where(x => x.LogicalName.Equals(attributeName)
&& x.AttributeType.Value == AttributeTypeCode.Picklist).FirstOrDefault();
if (null != metadata)
{
var option = metadata.OptionSet.Options.Where(x => x.Value == optionValue).FirstOrDefault();
if (null != option) return option.Label.UserLocalizedLabel.Label;
}
return string.Empty;
}
/// <summary>
/// 通過選項描述獲取選項值 這個效率更高,建議用這個 通過OptionsSetExt.EntityMetadata 先獲取EntityMetadata
/// </summary>
/// <param name="entity"> </param>
/// <param name="attributeName"></param>
/// <param name="optionLabel"> </param>
/// <returns></returns>
public static int OptionValue(this EntityMetadata entity, string attributeName, string optionLabel)
{
if (string.IsNullOrEmpty(optionLabel)) return -1;
var metadata = (PicklistAttributeMetadata)entity.Attributes.Where(x => x.LogicalName.Equals(attributeName)
&& x.AttributeType.Value == AttributeTypeCode.Picklist).FirstOrDefault();
if (null != metadata)
{
var option = metadata.OptionSet.Options.Where(x => x.Label.UserLocalizedLabel.Label == optionLabel).FirstOrDefault();
if (null != option) return option.Value ?? -1;
}
return -1;
}
/// <summary>
/// 獲取選項集列表
/// </summary>
/// <param name="service"> </param>
/// <param name="optionSetName"></param>
/// <returns></returns>
public static IList<KeyValuePair<string, int>> OptionList(this IOrganizationService service, string optionSetName)
{
var request = new RetrieveOptionSetRequest
{
Name = optionSetName
};
var response = (RetrieveOptionSetResponse)service.Execute(request);
var metadata = (OptionSetMetadata)response.OptionSetMetadata;
var list = metadata.Options.ToArray();
if (null != list && list.Length > 0)
{
var results = new List<KeyValuePair<string, int>>();
foreach (var item in list)
{
results.Add(new KeyValuePair<string, int>(item.Label.UserLocalizedLabel.Label, item.Value.Value));
}
return results;
}
return null;
}
/// <summary>
/// 根據entity獲取EntityMetadata
/// </summary>
/// <param name="service"> </param>
/// <param name="entityName"></param>
/// <returns></returns>
public static EntityMetadata EntityMetadata(this IOrganizationService service, string entityName)
{
var request = new RetrieveEntityRequest
{
LogicalName = entityName,
EntityFilters = EntityFilters.Attributes
};
var response = (RetrieveEntityResponse)service.Execute(request);
return response.EntityMetadata;
}
/// <summary>
/// 通過選項值獲取選項描述
/// </summary>
/// <param name="service"> </param>
/// <param name="optionSetName"></param>
/// <param name="optionValue"> </param>
/// <returns></returns>
public static string OptionLabel(this IOrganizationService service, string optionSetName, int optionValue)
{
var request = new RetrieveOptionSetRequest
{
Name = optionSetName
};
var response = (RetrieveOptionSetResponse)service.Execute(request);
var metadata = (OptionSetMetadata)response.OptionSetMetadata;
var option = metadata.Options.Where(x => x.Value == optionValue).FirstOrDefault();
if (null != option) return option.Label.UserLocalizedLabel.Label;
return string.Empty;
}
/// <summary>
/// 通過選項描述獲取選項值
/// </summary>
/// <param name="service"> </param>
/// <param name="optionSetName"></param>
/// <param name="optionLabel"> </param>
/// <returns></returns>
public static int OptionValue(this IOrganizationService service, string optionSetName, string optionLabel)
{
var request = new RetrieveOptionSetRequest
{
Name = optionSetName
};
var response = (RetrieveOptionSetResponse)service.Execute(request);
var metadata = (OptionSetMetadata)response.OptionSetMetadata;
var option = metadata.Options.Where(x => x.Label.UserLocalizedLabel.Label == optionLabel).FirstOrDefault();
if (null != option) return option.Value ?? -1;
return -1;
}
}
}