我使用RetrieveEntityRequest获取实体的属性'元数据:
RetrieveEntityRequest entityRequest = new RetrieveEntityRequest
{
EntityFilters = EntityFilters.Attributes,
LogicalName = joinedEntityName.Value,
};
RetrieveEntityResponse joinedEntityMetadata = (RetrieveEntityResponse)_service.Execute(entityRequest);
现在,考虑我需要为多个实体执行此请求。是否可以在一次执行中执行此操作(可能不是使用RetrieveEntityRequest),而不是为每个实体执行一次请求?
答案 0 :(得分:1)
您必须使用RetrieveAllEntitiesRequest
。以下示例:
RetrieveAllEntitiesRequest retrieveAllEntityRequest = new RetrieveAllEntitiesRequest
{
RetrieveAsIfPublished = true,
EntityFilters = EntityFilters.Attributes
};
RetrieveAllEntitiesResponse retrieveAllEntityResponse = (RetrieveAllEntitiesResponse)serviceProxy.Execute(retrieveAllEntityRequest);
CRM SDK仅采用全部或逐个方法。
您必须准备好您的实体列表&为每个项目发出RetrieveEntityRequest
。
答案 1 :(得分:1)
您无法使用RetrieveEntityRequest
执行此操作。但是,您可以执行RetrieveMetadataChangesRequest
来获得所需内容。它出于您的目的而误导性地命名,但如果您不提供ClientVersionStamp
属性,则只会检索您在Query
属性中指定的所有内容。
以下是一个简单示例,您可以在其中检索帐户和联系人的元数据,并仅检索LogicalName
和DisplayName
属性:
var customFilterExpression = new[]
{
new MetadataConditionExpression("LogicalName", MetadataConditionOperator.Equals, "account"),
new MetadataConditionExpression("LogicalName", MetadataConditionOperator.Equals, "contact")
};
var customFilter = new MetadataFilterExpression(LogicalOperator.Or);
customFilter.Conditions.AddRange(customFilterExpression);
var entityProperties = new MetadataPropertiesExpression
{
AllProperties = false
};
entityProperties.PropertyNames.AddRange("LogicalName", "DisplayName");
var request = new RetrieveMetadataChangesRequest
{
Query = new EntityQueryExpression
{
Properties = entityProperties,
Criteria = customFilter,
}
};
此方法还具有仅检索所需特定属性的优点,这使得请求更快,有效负载更小。它是专门为移动设计的,您只需要检索所需的元数据,以及自上次检索以来发生了哪些变化,但它在很多场景中都能很好地工作。