RetrieveMultiple в вызове RetrieveMultiple (вызывает бесконечный цикл) - PullRequest
0 голосов
/ 06 июня 2018

Я пишу плагин CRM.Он должен запускаться в сообщении «RetrieveMultiple» для объекта продавца на этапе 20 (предварительная операция).

Проблема заключается в том, что мне нужен список всех существующих продавцов на той же самой стадии подготовки к операции (вчтобы сравнить список со списком удаленных заказов и, при необходимости, создать новые заказы.

Чтобы получить список всех заказов, наивный подход заключается в использовании service.retrieveMultiple(salesOrderQuery), где salesOrderQuery - это выражение QueryExpression для salesorder.

Это приводит к тому, что процесс динамики 365 заходит в бесконечный цикл.

Мой вопрос таков: как я могу "предварительно извлечь" всех продавцов на стадии перед операцией для "RetrieveMultiple"сообщение о заказе, не вызывая бесконечный цикл?

В настоящее время я думаю, что, возможно, мне следует изменить событие, которое вызывает запуск моего плагина.Моя цель - извлечь все вновь созданные заказы из удаленной системы, когда пользователь загружает страницу «Заказы».Единственный подход, который я нашел, - это зарегистрировать мой шаг плагина в сообщении «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 голосов
/ 06 июня 2018

В основном RetrieveMultiple сообщение будет вызываться во всех местах, таких как Adv find, views, lookup, service.RetrieveMultiple вызовов, когда система запрашивается для этого конкретного объекта.

Использовать Depth свойство контекста для избегать бесконечных циклов .

if (context.Depth > 1)
    return;
...