Вопрос

Массовое добавление записей по циклу

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

Нравится

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

У вас в 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.

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