Как создать универсальный метод Dapper QueryMultipleAsync?C#

Место общения программистов C#
Ответить
Anonymous
 Как создать универсальный метод Dapper QueryMultipleAsync?

Сообщение Anonymous »

Я пытаюсь создать универсальный метод для получения нескольких наборов данных с помощью Dapper. Я укажу список ожидаемых типов данных, и метод предоставит мне список объектов определенного типа данных.

Код: Выделить всё

public async Task GetMultipleAsync(string storedProcedure, U parameters, List types)
{
var result = new List();
try
{
using (var multi = await _connection.QueryMultipleAsync(storedProcedure, parameters, commandType: CommandType.StoredProcedure, transaction: _transaction))
{
foreach (var type in types)
{
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List))
{
// Handle list types
var elementType = type.GetGenericArguments()[0];
var method = typeof(SqlMapper.GridReader)
.GetMethods()
.FirstOrDefault(m => m.Name == nameof(SqlMapper.GridReader.ReadAsync) &&
m.IsGenericMethod);

var genericMethod = method.MakeGenericMethod(elementType);
var task = (Task)genericMethod.Invoke(multi, null);
await task.ConfigureAwait(false);

var resultProperty = task.GetType().GetProperty("Result");
var data = resultProperty.GetValue(task);

result.Add(data);
}
else
{
// Handle single value types
var method = typeof(SqlMapper.GridReader)
.GetMethods()
.FirstOrDefault(m => m.Name == nameof(SqlMapper.GridReader.ReadSingleAsync) &&
m.IsGenericMethod);

var genericMethod = method.MakeGenericMethod(type);
var task = (Task)genericMethod.Invoke(multi, null);
await task.ConfigureAwait(false);

var resultProperty = task.GetType().GetProperty("Result");
var data = resultProperty.GetValue(task);

result.Add(data);
}
}
}
}
catch (Exception ex)
{ // Handle exception;
}
return result;
}
Я отправлю список типов данных ожидаемого типа, например

Код: Выделить всё

var types = new List
{
typeof(List),
typeof(List),
typeof(long)
};

var resultMultiple = await _dataAccess.GetMultipleAsync(storedProcedure, parameters, types);
и результат должен быть

Код: Выделить всё

var ListA = resultMultiple[0] as List;
var ListB = resultMultiple[1] as List;
var val = (long)resultMultiple[2];
этот метод выдает ошибку «Несоответствие количества параметров».

Подробнее здесь: https://stackoverflow.com/questions/792 ... tipleasync
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»