在使用Microsoft.Xrm.Sdk
命名空间一年后,我刚刚发现Entity.FormattedValues
属性包含实体特定(即本地)选项集文本的文本值。
之前我没有发现它的原因是,没有获得价值的早期约束方法。即entity.new_myOptionSet
属于OptionSetValue
类型,仅包含int
值。您必须调用entity.FormattedValues [“new_myoptionset”]以获取string
的{{1}}文本值。
因此,我想让crmsrvcutil自动生成本地选项集的文本属性。即,除了当前生成OptionSetValue
之外,还会生成Entity.new_myOptionSet
。
我查看了Microsoft.Crm.Services.Utility.ICodeGenerationService,但看起来主要用于指定Entity.new_myOptionSetText
应该是什么......
使用CrmServiceUtil添加这些属性是否有一种支持方式,或者我最好编写一个我可以运行的自定义应用程序,它可以将这些属性生成为自动生成的属性的部分类?
目前,每当我需要访问OptionSetValue的文本值时,我都会使用以下代码:
CodeGenerationType
选项集缓存将使用var textValue = OptionSetCache.GetText(service, entity, e => e.New_MyOptionSet);
和属性表达式来确定我要求的选项集的名称。然后,它将使用entity.LogicalName
查询SDK,以获取选项set int和text值的列表,然后将其缓存,以便不必再次访问CRM。然后,它查找实体的RetrieveAttriubteRequest
的int值,并将其与缓存列表交叉引用,以获取OptionSet的文本值。
我可以这样做(假设已从服务器检索实体,而不只是填充客户端),而不是完成所有这些操作:
New_MyOptionSet
但是“new_myoptionset”不再是早期约束。我希望生成的早期绑定实体类也为调用上面一行的OptionSetValue属性生成一个额外的“Text”属性,所以我的实体会添加它:
var textValue = entity.FormattedValues["new_myoptionset"];
答案 0 :(得分:0)
您是否可以利用CrmServiceUtil扩展程序为您的OptionSet生成枚举,然后将new_myOptionSetText属性添加到将int值与枚举进行比较的部分类和returns the enum string
答案 1 :(得分:0)
同样,我认为特别针对这种情况,让CrmSvcUtil.exe
生成您想要的代码是一个好主意,但更一般地说,您可以使用类似于接受的答案的方法通过反射访问属性名称@ workarounds for nameof() operator in C#: typesafe databinding
var textValue = entity.FormattedValues["new_myoptionset"];
// becomes
var textValue = entity.FormattedValues
[
// renamed the class from Nameof to NameOf
NameOf(Xrm.MyEntity).Property(x => x.new_MyOptionSet).ToLower()
];
答案 2 :(得分:0)
最新版本的CRM Early Bound Generator包含一个包含字段名称的Fields
结构。这允许访问FormattedValues就像这样简单:
var textValue = entity.FormattedValues[MyEntity.Fields.new_MyOptionSet];
您可以通过CrmSvcUtil的界面创建一个新属性,但这对于一个相当简单的调用来说有很多工作要做,而且我认为它不足以创建其他属性。