4

在使用Microsoft.Xrm.Sdk命名空间一年后,我昨天才发现该Entity.FormattedValues属性包含实体特定(即本地)选项集文本的文本值。

我之前没有发现它的原因是没有早期绑定的方法来获取价值。ieentity.new_myOptionSetOptionSetValue只包含int值的类型。您必须调用 entity.FormattedValues["new_myoptionset"] 来string获取OptionSetValue.

因此,我想让 crmsrvcutil 为本地选项集自动生成一个文本属性。即随着Entity.new_myOptionSet它当前的生成,Entity.new_myOptionSetText也会生成。

我查看了Microsoft.Crm.Services.Utility.ICodeGenerationService,但这看起来主要是为了指定CodeGenerationType应该是什么......

有没有一种方法支持使用 CrmServiceUtil 添加这些属性,或者我最好编写一个我可以运行的自定义应用程序,它可以将这些属性作为自动生成的部分类生成?

编辑 - 我想生成的代码示例

目前,每当我需要访问 OptionSetValue 的文本值时,我都会使用以下代码:

var textValue = OptionSetCache.GetText(service, entity, e => e.New_MyOptionSet);

选项集缓存将使用entity.LogicalName, 和属性表达式来确定我要求的选项集的名称。然后,它将使用 , 查询 SDK RetrieveAttriubteRequest,以获取选项集 int 和文本值的列表,然后将其缓存,因此不必再次访问 CRM。然后它查找New_MyOptionSet实体的 int 值并将其与缓存列表交叉引用,以获取 OptionSet 的文本值。

而不是做所有这些,我可以这样做(假设实体已从服务器检索,而不仅仅是填充客户端):

var textValue = entity.FormattedValues["new_myoptionset"];

但“new_myoptionset”不再是早期绑定。我希望生成的早期绑定实体类也为调用上述行的 OptionSetValue 属性生成一个额外的“文本”属性,因此我的实体会将其添加到其中:

public string New_MyOptionSetText {
    return this.GetFormattedAttributeValue("new_myoptionset"); // this is a protected method on the Entity class itself...
}
4

3 回答 3

0

您能否利用将为您的 OptionSets 生成枚举的 CrmServiceUtil 扩展,然后将您的 new_myOptionSetText 属性添加到将 int 值与枚举进行比较并返回枚举字符串的部分类中

于 2012-11-02T13:10:04.570 回答
0

同样,我认为专门针对这种情况,CrmSvcUtil.exe生成您想要的代码是一个好主意,但更一般地说,您可以使用类似于接受的答案@workarounds for nameof() operator in C#通过反射访问属性名称: 类型安全的数据绑定

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()
];
于 2012-11-03T16:57:00.183 回答
0

最新版本的CRM Early Bound Generator包括一个Fields包含字段名称的结构。这允许访问 FormattedValues 就像这样简单:

var textValue = entity.FormattedValues[MyEntity.Fields.new_MyOptionSet];

您可以通过 CrmSvcUtil 的接口创建一个新属性,但是对于一个相当简单的调用来说,这需要做很多工作,而且我不认为它可以证明创建其他属性是合理的。

于 2016-04-25T17:44:43.623 回答