Вопрос

Изменение ответственного в разделе итерациями по 1000 записей

Доброго времени суток. Стоит задача смены ответственных в разделе при определенных условиях, записей в разделе более 200 тыс. Необходимо для оптимизации менять значения в пачках по 1000 записей. Подскажите варианты решения данной задачи.

Нравится

5 комментариев
Лучший ответ

Добрый день!

Если не нужно при этом генерировать сигналы объектов, то посоветую реализовать все в хранимой процедуре. Там уже реализовать цикл. Тем самым вы добьетесь максимальной производительности. А процедуру вызывать в скрипте C#.

Добрый день!

Если не нужно при этом генерировать сигналы объектов, то посоветую реализовать все в хранимой процедуре. Там уже реализовать цикл. Тем самым вы добьетесь максимальной производительности. А процедуру вызывать в скрипте C#.

Если доступа к серверу нет, то можно и без хранимок, используя в C#-скрипте БП классы Select и Update. С ними тоже сигналы не генерируются. А если нужно, чтобы по каждой записи отрабатывала логика встроенных и отдельных БП на изменение ответственного, то только с использованием класса EntitySchemaQuery.

Зверев Александр,

Да забыл уточнить доступа к серверу действительно нет.

 

Пробовал реализовать через esq: 

          var isOwnerInChange = true;

           while (isOwnerInChange) {

                var subQuery = new EntitySchemaQuery(_uc.EntitySchemaManager,"UsrChangeOwnerHelperLog");

                    subQuery.AddColumn("UsrEntityId");

    

                var entitySchemaManager = _uc.EntitySchemaManager;

                var esq = new EntitySchemaQuery(entitySchemaManager, "Название схемы");

                esq.UseAdminRights = false;

                esq.AddAllSchemaColumns();



              //  какие то фильтры

                

                var mainFilter = new EntitySchemaQueryFilter(FilterComparisonType.NotExists);

                    mainFilter.LeftExpression = esq.CreateSchemaColumnExpression("Id");

                    mainFilter.RightExpressions.Add(new EntitySchemaQueryExpression(subQuery));

                    esq.Filters.Add(mainFilter);

                

                esq.RowCount=1000;

                    

                var entities = esq.GetEntityCollection(_uc);

                

                if (entities.Count > 0)

                    {

                        foreach (Entity entity in entities)

                        {

                            var entityId = entity.GetTypedColumnValue<Guid>("Id");

                            var newOwnerId = SearchOwner(accountId, "Account");



                            //Какая то логика

                        }

                } else {

                    isOwnerInChange = false;

                }

            }

В конце не забудьте каждой entity.Save();

Показать все комментарии