【发布时间】:2014-07-08 23:21:35
【问题描述】:
因此,当您拥有实体名称时,尝试获取对象类型代码似乎是 CRM 中一个相当常见的问题。但是由于我总是要以艰难的方式做事,所以我有相反的任务:我有对象类型代码,并且需要获取实体名称。
一般来说,最终任务是获取有关电子邮件信息的 CRM,并使用它来查询 CRM 以获取更多信息。我可以轻松获得相关 ID 和对象类型代码。对于标准实体,我可以使用硬编码查找来获取实体名称。但对于自定义实体,这是行不通的,因为不同组织中的对象类型代码可能不同。
获取相关ID和对象类型代码:
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);
}
【问题讨论】:
-
你真的应该远离使用对象类型代码。对象类型代码由实体添加到您的 CRM 版本的顺序决定。因此,如果您有一个测试环境并添加了 A、B 和 C,但是在 prod 中添加 A、C 和 B,则 B 和 C 的类型代码将在不同环境中有所不同...
-
我同意,但这是存储在 Outlook 项目中的信息。这是微软的选择,不是我的。
标签: dynamics-crm-2011 outlook-addin outlook-2010 dynamics-crm-2013 outlook-2013