Выполнение одной хранимой процедуры N-количество раз с разными параметрами

Для вставки огромных массивов сущностей (допустим, от 100к) есть расширение для EF - BulkCopyAsync. Данное расширение позволяет вставить в таблицу огромное количество записей в очень короткий промежуток времени. Но при попытке найти что-либо похожее на тему хранимых процедур поставило меня в ступор. Теперь к проблеме.

Репозиторий:

public async Task<List<Person>> GetMatches(Person[] persons)
{
var personMatches = new List<Person>();

var templateStoredProc = "EXEC pMatches @FamilyName, @FirstName, @Patronymic, @BirthDate, @Result OUT"; // Выражение хранимой процедуры с параметрами

foreach (var person in persons)
{
    SqlParameter resultParam = new()
    {
        ParameterName = "@Result",
        SqlDbType = SqlDbType.Int,
        Direction = ParameterDirection.Output
    };

    var fullName = person.PersonInfo.FullName;

    var sqlParams = new List<SqlParameter>()
    {
        new SqlParameter("@FamilyName", fullName.LastName),
        new SqlParameter("@FirstName", fullName.FirstName),
        new SqlParameter("@Patronymic", fullName.MiddleName),
        new SqlParameter("@BirthDate", DateTime.Parse(fullName.BirthDate)),
        resultParam
    };

    await _context.Database.ExecuteSqlRawAsync(templateStoredProc, sqlParams);

    if ((int)resultParam.Value > 0)
        personMatches.Add(person);
}

return personMatches;
}

Хранимая процедура:

CREATE PROCEDURE dbo.pMatches

     @FamilyName  varchar(100) = null 
    ,@FirstName   varchar(100) = null 
    ,@Patronymic  varchar(100) = null 
    ,@DateBirth   date = null 

    ,@Result      int = null output

Собственно сама проблема заключается в том, что, нужно обработать каждый элемент входящего массива на наличие записей в таблице, соответственно в цикле обрабатывается каждый элемент, и на выполнение каждой хранимой процедуры уходит порядка 80мс. А во входящем массиве может быть и по 10к элементов, и на обработку уходит безумно много времени

UPD: Рассматривал как вариант объединить все запросы в один SQL запрос, но как получить список со всеми этими найденными совпадениями?


Ответы (0 шт):