C# RetrieverRequest和IOrganizationService.Retrieve在CRM中有什么区别?

C# RetrieverRequest和IOrganizationService.Retrieve在CRM中有什么区别?,c#,dynamics-crm-2011,workflow,C#,Dynamics Crm 2011,Workflow,我是C#的CRM工作流步骤开发新手。我需要知道ioorganizationservice中的RetrieveRequest和Retrieve之间的主要区别是什么。 什么时候必须使用哪一个? 是否有任何示例显示如何使用此对象以执行者的方式运行?aRetrieveRequest和IOrganizationService的Retrieve方法执行的操作完全相同:检索特定记录 最终可以批处理RetrieveRequest(使用ExecuteMultipleRequest消息),但就我个人而言,我从未见过

我是C#的CRM工作流步骤开发新手。我需要知道
ioorganizationservice
中的
RetrieveRequest
Retrieve
之间的主要区别是什么。 什么时候必须使用哪一个?
是否有任何示例显示如何使用此对象以执行者的方式运行?

a
RetrieveRequest
IOrganizationService
Retrieve
方法执行的操作完全相同:检索特定记录


最终可以批处理
RetrieveRequest
(使用
ExecuteMultipleRequest
消息),但就我个人而言,我从未见过批处理
RetrieveRequest
,因为通常情况下,
UpdateRequest
DeleteRequest
是为了提高性能而批处理的方法。

在大多数情况下,
Retrieve
方法就足够了

然而,
RetrieveRequest
增加了一个有趣的特性:它提供了一个选项,可以一次性查询与检索到的对象相关联的数据

假设您需要发票数据及其发票产品记录。一个选项是创建一个
QueryExpression
,并将invoice实体和invoicedetail实体的结果连接起来。这将产生一个潜在的大表

使用
RetrieveRequest
可以在一个请求中查询与检索到的实体关联的记录

例如:

private readonly IOrganizationService _service;

public Entity GetFullInvoice(Guid invoiceId)
{
    var request = new RetrieveRequest
    {
        ColumnSet = new ColumnSet(allColumns: true),
        Target = new EntityReference("invoice", invoiceId),
        RelatedEntitiesQuery = new RelationshipQueryCollection()
    };

    var relation = new Relationship("invoice_details");
    relation.PrimaryEntityRole = EntityRole.Referenced;

    var invoiceDetailQuery = new QueryExpression("invoicedetail");
    invoiceDetailQuery.ColumnSet = new ColumnSet(allColumns: true);
    invoiceDetailQuery.Criteria.AddCondition("invoiceid", ConditionOperator.Equal, invoiceId);

    var result = (RetrieveResponse)_service.Execute(request);

    return result.Entity;
}
GetFullInvoice
返回的
Entity
对象具有一个
RelatedEntities
属性,该属性保存与发票相关的实体集合


可以将多个查询添加到
RetrieverRequest
,因此也可以一次性检索相关活动等。

感谢您的回答。他们的表现真的一样吗?我的工作流步骤,有多个检索和更新复杂的过滤器表达式。当我在多个实体上运行时,它将进入等待状态!因此,我需要最有效的方法。谢谢你明确的回答。是否进行了任何测试以检查性能?我有一些相关的实体。通过RetreiveMultipleRequest或organizationService检索基本实体和相关实体是否更好。检索基本实体,然后在循环中获取相关实体?我想这取决于您必须查询的数据。将
QueryExpression
转换为单个SQL(联接)选择。
RetrieveRequest
被转换为对主实体记录的选择,以及对添加到请求中的每个相关实体查询的单独选择。当您希望收到许多相关记录时,单个
QueryExpression
可能会产生一个较大的结果集,因为主实体记录的列在每一行中都是重复的。
retrievereRequest
可以提供更紧凑的数据集,并节省到应用程序服务器的往返时间。再次感谢。当我在一条记录上运行自定义工作流时,这是正常的,当选择多条记录并再次运行时,我的进程将处于等待状态。我认为这是因为我的代码,必须调整查询或使用多线程概念。当我们在多个记录上运行工作流时,是否有任何方法可以防止覆盖工作流的运行?如何处理具有多个记录的工作流的多个并发运行?基本上,您不能。有一些场景需要设计一个一致的批处理流程。拥有大量并发执行的工作流实例通常会导致问题:系统速度减慢、死锁等。我有一个自定义实体的工作流步骤。在我的代码中,我检索多个实体并更新其他实体。为了能够在CRM中处理多个并发运行,编写代码的最佳实践是什么?是否存在任何例子?(用C语言)。