有人可以帮我弄清楚如何使用CRM 2011 SDK检索一个选项集标签的不同语言吗?
我的任务如下: 例如,我有一个与德语的联系,然后我的sdk应该带回我那个语言的选项集值。我的联系方式是英国国家,sdk应该把我带回英文标签等等。
获取价值没问题:
int optSetValue = ((OptionSetValue)entity["optionsetFieldName"]).value
但我怎样才能以正确的语言获得标签?
答案 0 :(得分:4)
您需要执行RetrieveAttributeRequest
来获取EnumAttributeMetadata
,然后根据语言代码查找正确的值:
string languageCode = germanLanguageCode; // Set
int optSetValue = 0; // Set
RetrieveAttributeRequest attributeRequest = new RetrieveAttributeRequest
{
EntityLogicalName = entityLogicalName,
LogicalName = attributeName,
RetrieveAsIfPublished = true
};
var response = (RetrieveAttributeResponse)service.Execute(attributeRequest);
var optionList = ((EnumAttributeMetadata)response.AttributeMetadata).OptionSet.Options;
return optionList.GetFirst(o => o.Value == optSetValue).Label.LocalizedLabels.First(l => l.LanguageCode == languageCode).Label;
或者,如果您的服务是以德语用户身份运行,那么您可以通过return optionList.GetFirst(o => o.Value == optSetValue).Label.UserLocalizedLabel.Label;
我倾向于缓存元数据,而不是经常访问CRM服务器以获取文本信息。但话说回来,我只是一个英语组织,不必担心人们使用的语言......
GetFirst()
只是标准的Linq方法。只要您在using语句中添加了System.Linq命名空间,任何IEnumerable都会拥有它。
德语位于1031。虽然更正确的路线是查找用户的UsersSetting.UILanguageId。我认为应该包含正确的代码,尽管我还没有测试过它......
答案 1 :(得分:0)
要检索所选值的用户本地化选项标签,请尝试
string myoption;
if (!entity.FormattedValues.TryGetValue("optionsetFieldName", out myoption))
{
myoption = "Not found";
}
还可以使用LINQ查询IList<KeyValuePair<string,string>>
FormattedValues 。
答案 2 :(得分:0)
string optionlabel =entity.FormattedValues["optionsetFieldName"];
答案 3 :(得分:0)
为我工作的代码:
public static dynamic GetOptionSet(string entityName, string fieldName, int langId, OrganizationServiceProxy proxy)
{
RetrieveEntityRequest retrieveDetails = new RetrieveEntityRequest();
retrieveDetails.EntityFilters = EntityFilters.All;
retrieveDetails.LogicalName = entityName;
RetrieveEntityResponse retrieveEntityResponseObj = (RetrieveEntityResponse)proxy.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.LocalizedLabels.First(l => l.LanguageCode == langId).Label }).ToList();
return optionlist;
}