C# RetrieveMultiple调用中的RetrieveMultiple(导致无限循环)

C# RetrieveMultiple调用中的RetrieveMultiple(导致无限循环),c#,dynamics-crm,infinite-loop,C#,Dynamics Crm,Infinite Loop,我正在编写一个CRM插件。在第20阶段的预操作中,应在检索salesorder实体的多条消息时触发 问题是,我需要一个所有现有销售订单的列表,以便将该列表与远程订单列表进行比较,并在需要时创建新订单 要获取所有订单的列表,最简单的方法是使用service.retrieveMultiplesalesOrderQuery,其中salesOrderQuery是salesorder上的QueryExpression 这当然会导致动态过程进入无限循环 我的问题是:如何在预操作阶段为salesorder上的

我正在编写一个CRM插件。在第20阶段的预操作中,应在检索salesorder实体的多条消息时触发

问题是,我需要一个所有现有销售订单的列表,以便将该列表与远程订单列表进行比较,并在需要时创建新订单

要获取所有订单的列表,最简单的方法是使用service.retrieveMultiplesalesOrderQuery,其中salesOrderQuery是salesorder上的QueryExpression

这当然会导致动态过程进入无限循环

我的问题是:如何在预操作阶段为salesorder上的RetrieveMultiple消息预检索所有salesorder,而不引起无限循环

我目前在想,也许我应该更改导致执行插件的事件。我的目标是在用户加载订单页面时从远程系统获取所有新创建的订单。到目前为止,我找到的唯一方法是在RetrieveMultiple消息上注册我的插件步骤

但如何获得所有现有订单呢

到目前为止,我的插件如下所示:

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PSPlugins
{
    public class RetrieveOrdersPlugin : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {

            var context = serviceProvider.GetService(typeof(IPluginExecutionContext)) as IPluginExecutionContext;

            // check if pre-operation
            if (context.Stage != 20)
                throw new InvalidPluginExecutionException("Must run as pre-operation stage 20");
            if (context.MessageName != "RetrieveMultiple")
                throw new InvalidPluginExecutionException("Registered for " + context.MessageName + " only RetrieveMultiple is supported");
            if (context.PrimaryEntityName != "salesorder")
                throw new InvalidPluginExecutionException("Registered for " + context.PrimaryEntityName + " entity and only salesorder is supported");

            var tracingService = serviceProvider.GetService(typeof(ITracingService)) as ITracingService;
            var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)) as IOrganizationServiceFactory;
            var service = serviceFactory.CreateOrganizationService(context.UserId) as IOrganizationService;

            tracingService.Trace("Plug-in RetrieveOrders executed");

            QueryExpression soQuery = new QueryExpression();
            soQuery.EntityName = "salesorder";
            soQuery.ColumnSet = new ColumnSet() { AllColumns = true };

            soQuery.Criteria = new FilterExpression();
            soQuery.Criteria.FilterOperator = LogicalOperator.And;

            // The following line causes an infinite loop...
            EntityCollection entities = service.RetrieveMultiple(soQuery);

        }
    }
}
基本上,RetrieveMultiple消息将在所有地方调用,如Adv find、views、lookup、service.RetrieveMultiple调用,在这些地方系统将被查询到该特定实体

使用上下文的Depth属性来创建


当检查context.Depth是否大于1时,代码现在可以正常运行。但在调试时,我发现行EntityCollection entities=service.retrieveMultiplesQuery;总是导致用户未处理的异常。我不明白为什么调试时检索实体失败。在运行时,如果不在dynamics中进行分析,它可以正常工作。
if (context.Depth > 1)
    return;