在RetrieveMultiple调用中检索多个(导致无限循环)

时间:2018-06-06 08:59:29

标签: c# dynamics-crm infinite-loop

我正在编写CRM插件。它应该在" RetrieveMultiple"在第20阶段(操作前)的销售订单实体的消息。

问题在于我需要在该预运营阶段的所有现有销售人员的清单(为了将清单与远程订单列表进行比较并在需要时创建新订单)。

要获取所有订单的列表,天真的方法是使用service.retrieveMultiple(salesOrderQuery),其中salesOrderQuery是salesorder上的QueryExpression。

这导致动态365过程进入无限循环。

我的问题是:我怎样才能预先检索"所有销售人员处于" 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);

        }
    }
}

1 个答案:

答案 0 :(得分:1)

基本上RetrieveMultiple消息将在Adv查找,视图,查找,service.RetrieveMultiple调用等所有位置调用,其中系统正在为该特定实体进行查询。

使用Depth的{​​{1}}属性。

if (context.Depth > 1)
    return;