Всем доброго дня. Версия 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.