You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动