Dynamics OptionSetExt

幾年前寫過一個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;
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章