Dynamics crm 2011 如何从RegardingID的对象类型代码中获取CRM实体名称?

Dynamics crm 2011 如何从RegardingID的对象类型代码中获取CRM实体名称?,dynamics-crm-2011,outlook-addin,outlook-2010,dynamics-crm-2013,outlook-2013,Dynamics Crm 2011,Outlook Addin,Outlook 2010,Dynamics Crm 2013,Outlook 2013,因此,在CRM中,当您有实体名称时,尝试获取对象类型代码似乎是一个相当常见的问题。但由于我总是要以艰难的方式做事,所以我有相反的任务:我有对象类型代码,需要获取实体名称 一般来说,最终的任务是获取CRM关于电子邮件信息的信息,并使用它来查询CRM以获取其他信息。我可以很容易地获得regardingID和对象类型代码。对于标准实体,我可以使用硬编码查找来获取实体名称。但对于自定义实体,这将不起作用,因为不同组织中的对象类型代码可能不同 要获取regardingID和对象类型代码: string r

因此,在CRM中,当您有实体名称时,尝试获取对象类型代码似乎是一个相当常见的问题。但由于我总是要以艰难的方式做事,所以我有相反的任务:我有对象类型代码,需要获取实体名称

一般来说,最终的任务是获取CRM关于电子邮件信息的信息,并使用它来查询CRM以获取其他信息。我可以很容易地获得regardingID和对象类型代码。对于标准实体,我可以使用硬编码查找来获取实体名称。但对于自定义实体,这将不起作用,因为不同组织中的对象类型代码可能不同

要获取regardingID和对象类型代码:

string regardingId;
regardingId = (String)(item.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/crmRegardingId"));

dynamic crmRegardingObjectType;
crmRegardingObjectType = item.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/crmRegardingObjectType");
我可以请求检索所有实体的元数据并找到适当的对象类型代码,但这非常缓慢,而且数据太多:

RetrieveAllEntitiesRequest entitiesRequest = new RetrieveAllEntitiesRequest();
entitiesRequest.EntityFilters = EntityFilters.Entity;
RetrieveAllEntitiesResponse response = (RetrieveAllEntitiesResponse)service.Execute(entitiesRequest);
我不得不想有更好的办法,但我已经被困了一段时间

回答 这就是我最后做的:

        string entityLogicalName = String.Empty;

        MetadataFilterExpression EntityFilter = new MetadataFilterExpression(LogicalOperator.And);
        EntityFilter.Conditions.Add(new MetadataConditionExpression("ObjectTypeCode", MetadataConditionOperator.Equals, objectTypeCode));

        MetadataPropertiesExpression mpe = new MetadataPropertiesExpression();
        mpe.AllProperties = false;
        mpe.PropertyNames.Add("DisplayName");
        mpe.PropertyNames.Add("ObjectTypeCode");
        mpe.PropertyNames.Add("PrimaryIdAttribute");
        mpe.PropertyNames.Add("PrimaryNameAttribute");

        EntityQueryExpression entityQueryExpression = new EntityQueryExpression()
        {
            Criteria = EntityFilter,
            Properties = mpe
        };

        RetrieveMetadataChangesResponse initialRequest = GetMetadataChanges(entityQueryExpression, null, DeletedMetadataFilters.OptionSet);
        if (initialRequest.EntityMetadata.Count == 1)
        {
            entityLogicalName = initialRequest.EntityMetadata[0].LogicalName;
        }

        return entityLogicalName;

    protected RetrieveMetadataChangesResponse GetMetadataChanges(EntityQueryExpression entityQueryExpression, String clientVersionStamp, DeletedMetadataFilters deletedMetadataFilter)
    {
        RetrieveMetadataChangesRequest retrieveMetadataChangesRequest = new RetrieveMetadataChangesRequest()
        {
            Query = entityQueryExpression,
            ClientVersionStamp = clientVersionStamp,
            DeletedMetadataFilters = deletedMetadataFilter
        };

        return (RetrieveMetadataChangesResponse)organizationService.Execute(retrieveMetadataChangesRequest);
    }

自2011年CRM汇总12起。因此,您可以尝试构建查询并仅获取一个实体,而不是查询所有实体。

您应该真正远离使用对象类型代码。对象类型代码由实体添加到CRM版本的顺序决定。因此,如果您有一个测试环境并添加了a、B和C,但在prod add a、C和B中,B和C的类型代码在不同的环境中会有所不同……我同意,但这是存储在Outlook项目中的信息。这是微软的选择,不是我的。这让我想到了我在上面添加的解决方案。我不太确定我所做的是否是建议的,因为使用RetrieveMetadataChangesRequest似乎很奇怪。