Есть ли способ сделать это более эффективным? Это занимает слишком много времени, когда я вставляю массив из 50+ элементов.

Метод вызывается моим контроллером API.

Заранее спасибо, я еще новичок в этом деле.

DataAccess data = new DataAccess();

[HttpPost].
public void Post(Contract[] contractList)
{
    data.insertContracts(contractList);
}

public class DataAccess
{
    public void insertList(Contract[] contractList)
    {
        using (IDbConnection connection = new SqlConnection(connectString))
        {
            foreach (var item in contractList)
            {
                 Execute("dbo.spInsertContract @contract_Id, @color, @contract_Type, @ne_Type, @storn, @dispo_Id, @kw, @create_Date, @termin_Date", item);
            }
        }    
    }
}

Ответы (1)

Этот код работает нормально, и его производительность сравнима с обычным подходом. Поэтому он не совсем подходит для вставки больших объемов данных. Идеальный способ - использовать SQL Bulk Copy и забыть о Dapper.

public async Task InsertList(Contract[] contractList)
{
    using (var connection = new SqlConnection("ConnectionString"))
    {
        var parameters = contractList.Select(u =>
        {
            var tempParams = new DynamicParameters();
            tempParams.Add("@contract_Id", u, DbType.Int32, ParameterDirection.Input);
            tempParams.Add("@color", u, DbType.String, ParameterDirection.Input);
            tempParams.Add("@contract_Type", u, DbType.String, ParameterDirection.Input);
            ...
            return tempParams;
        });

        await connection.ExecuteAsync("INSERT INTO [Contract] (contract_Id, color, contract_Type, ...) VALUES ( @contract_Id, @color, @contract_Type,...)",
            parameters).ConfigureAwait(false);
    }
}

2022 WebDevInsider