Всем доброго дня. Версия 7.15.
Как в коде в задании-сценарии бизнес-процесса создать несколько записей одним запросом? К примеру, нужно создать несколько записей внутри цикла:
foreach (var groupItem in groupCollection) { //Создадим запись try { var entity = new Terrasoft.Configuration.WSObject(userConnection); entity.SetDefColumnValues(); //... entity.Save(); } catch (Exception exc) { //return false; } }
Можно ли вместо серии запросов выполнить один запрос на добавление сразу нескольких записей?
К примеру, в JavaScript на клиенте аналогичное действие можно выполнить следующий образом:
var bq = this.Ext.create("Terrasoft.BatchQuery"); arr.forEach(function(item, i, arr) { var insert = Ext.create("Terrasoft.InsertQuery", { rootSchemaName: "WSObject" }); insert.setParameterValue("WSComment", item.comment, Terrasoft.DataValueType.TEXT); //прочие колонки bq.add(insert); }); bq.execute(function(addresponse){});
Тогда в базу уйдёт один запрос. Как сделать аналогичное действие на c#?
Нравится
У вас в batchQuery несколько insert каждый из которых выполняется в отдельности, он не отличается от c# варианта который вы описали.
В c# коде описан нормальный цикл для создания каждой записи по отдельности, так и делается нормальное создание нескольких записей.
Если вы хотите выполнить вариант sql в котором один insert с несколькими values, вам надо использовать либо CustomQuery в котором прописан sql. Либо попробовать обертку для insert в виде класса Insert.
Entity можно добавлять в EntityCollection, а потом вызывать entityCollection.Save
Николай, спасибо.
А есть пример добавления записей в такую коллекцию?
Например, в схеме MLPredictionSaver:
MLResultListSchemaConfig resultListSchemaConfig = GetResultListSchemaConfig(modelConfig); var entityCollection = new EntityCollection(_userConnection, resultListSchemaConfig.EntitySchema); foreach (RecommendationOutput output in predictionResult.Outputs) { foreach (RecommendedItem item in output.Items) { Entity entity = resultListSchemaConfig.EntitySchema.CreateEntity(_userConnection); entity.UseAdminRights = UseAdminRights; entity.SetColumnValue("Id", Guid.NewGuid()); entity.SetColumnValue(resultListSchemaConfig.SubjectColumn, output.UserId); entity.SetColumnValue(resultListSchemaConfig.ObjectColumn, item.ItemId); if (resultListSchemaConfig.ValueColumn != null) { entity.SetColumnValue(resultListSchemaConfig.ValueColumn, item.Score); } if (resultListSchemaConfig.ModelColumn != null) { entity.SetColumnValue(resultListSchemaConfig.ModelColumn, modelConfig.Id); } if (resultListSchemaConfig.DateColumn != null) { entity.SetColumnValue(resultListSchemaConfig.DateColumn, DateTime.UtcNow); } entityCollection.Add(entity); } } entityCollection.Save();
Уже заведена идея дать возможность сохранять несколько entity в одной транзакции.
Зверев Александр,
Я так и не поняла из этого поста, можно ли использовать BatchQuery на стороне сервера?
Если да, то хотелось бы увидеть примеры такой реализации.
У вас в batchQuery несколько insert каждый из которых выполняется в отдельности, он не отличается от c# варианта который вы описали.
В c# коде описан нормальный цикл для создания каждой записи по отдельности, так и делается нормальное создание нескольких записей.
Если вы хотите выполнить вариант sql в котором один insert с несколькими values, вам надо использовать либо CustomQuery в котором прописан sql. Либо попробовать обертку для insert в виде класса Insert.