Выполнение одной хранимой процедуры 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 запрос, но как получить список со всеми этими найденными совпадениями?