一次检索多个实体的执行请求?

时间:2017-08-31 11:04:06

标签: c# dynamics-crm

我使用RetrieveEntityRequest获取实体的属性'元数据:

RetrieveEntityRequest entityRequest = new RetrieveEntityRequest
{
    EntityFilters = EntityFilters.Attributes,
    LogicalName = joinedEntityName.Value,
};

RetrieveEntityResponse joinedEntityMetadata = (RetrieveEntityResponse)_service.Execute(entityRequest);

现在,考虑我需要为多个实体执行此请求。是否可以在一次执行中执行此操作(可能不是使用RetrieveEntityRequest),而不是为每个实体执行一次请求?

2 个答案:

答案 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属性中指定的所有内容。

以下是一个简单示例,您可以在其中检索帐户和联系人的元数据,并仅检索LogicalNameDisplayName属性:

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,
    }
};

此方法还具有仅检索所需特定属性的优点,这使得请求更快,有效负载更小。它是专门为移动设计的,您只需要检索所需的元数据,以及自上次检索以来发生了哪些变化,但它在很多场景中都能很好地工作。