如何在Dynamics 365的CodeActivity中通过工作流实例ID获取工作流ID?
通过Workflow Instance ID获取Workflow ID并查询备注的CodeActivity实现
我之前做Dynamics 365工作流CodeActivity的时候,刚好遇到过一模一样的问题——手里只有Workflow Instance ID,要拿关联的工作流ID去查备注。其实方法很直接,利用Dataverse里的workflowinstance实体就能搞定,下面是我实际验证过的方案:
核心思路
Dataverse中的workflowinstance实体专门记录工作流的运行实例,它的workflowid字段是一个Lookup类型,直接关联到对应的workflow(工作流)实体。我们只需要通过当前的Workflow Instance ID查询workflowinstance记录,就能提取出关联的工作流ID,之后再用这个ID去查询备注(annotation实体)即可。
完整代码示例
using System; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; using Microsoft.Xrm.Sdk.Workflow; public class GetWorkflowNotes : CodeActivity { protected override void Execute(CodeActivityContext context) { // 从上下文获取必要的服务和信息 IWorkflowContext workflowContext = context.GetExtension<IWorkflowContext>(); IOrganizationServiceFactory serviceFactory = context.GetExtension<IOrganizationServiceFactory>(); IOrganizationService service = serviceFactory.CreateOrganizationService(workflowContext.UserId); // 当前工作流实例的ID Guid workflowInstanceId = workflowContext.WorkflowInstanceId; Guid targetWorkflowId = Guid.Empty; try { // 1. 查询workflowinstance,获取关联的工作流ID QueryExpression instanceQuery = new QueryExpression("workflowinstance") { // 只需要获取workflowid字段,提升性能 ColumnSet = new ColumnSet("workflowid"), Criteria = new FilterExpression { Conditions = { new ConditionExpression("instanceid", ConditionOperator.Equal, workflowInstanceId) } } }; EntityCollection instanceResults = service.RetrieveMultiple(instanceQuery); if (instanceResults.Entities.Count == 0) { throw new InvalidOperationException("未找到与当前实例ID匹配的工作流实例记录"); } // 提取工作流ID targetWorkflowId = instanceResults.Entities[0].GetAttributeValue<EntityReference>("workflowid").Id; // 2. 根据工作流ID查询关联的备注 QueryExpression noteQuery = new QueryExpression("annotation") { ColumnSet = new ColumnSet("subject", "notetext", "createdon", "createdby"), Criteria = new FilterExpression { Conditions = { new ConditionExpression("objectid", ConditionOperator.Equal, targetWorkflowId), // 限定关联实体类型为workflow,避免和其他实体的备注混淆 new ConditionExpression("objecttypecode", ConditionOperator.Equal, "workflow") } }, // 按创建时间倒序排列,最新的备注在前 Orders = { new OrderExpression("createdon", OrderType.Descending) } }; EntityCollection noteResults = service.RetrieveMultiple(noteQuery); // 这里可以根据需求处理备注数据,比如输出到日志、赋值给工作流参数等 foreach (Entity note in noteResults.Entities) { string noteSubject = note.GetAttributeValue<string>("subject"); string noteText = note.GetAttributeValue<string>("notetext"); // 处理逻辑... } } catch (Exception ex) { throw new InvalidPluginExecutionException("获取工作流备注时发生错误: " + ex.Message, ex); } } }
关键注意事项
- 性能优化:查询
workflowinstance时只请求workflowid字段,不要查询所有列,减少数据传输量。 - 实体类型限定:查询备注时一定要加上
objecttypecode = "workflow"的条件,因为不同实体的备注都存在annotation表中,避免拿到其他实体的无关备注。 - 异常处理:要考虑查询不到
workflowinstance记录的情况,比如实例记录被清理的场景,做好异常捕获和提示。
内容的提问来源于stack exchange,提问作者user3085988




