Я создал небольшое количество общих c процедур, использующих Dapper для возврата списков или отдельных элементов любого заданного типа (используя SP на стороне SQL) для использования в службе данных модели DI, например,
public async Task<List<TOut>> GetList<TOut>(string proc, dynamic parameters)
{
await using var conn = new SqlConnection(connectionString);
var cmd = parameters == null ? new CommandDefinition(commandText: proc, commandType: CommandType.StoredProcedure) : new CommandDefinition(commandText: proc, commandType: CommandType.StoredProcedure, parameters: parameters);
return conn.Query<TOut>(cmd).ToList();
}
Однако я пытался расширить это, чтобы использовать метод QueryMultiple для возврата произвольного числа наборов результатов в одном запросе (для эффективности, поскольку первый запрос довольно дорогой, а другие наборы результатов зависят от него) , Я хотел бы закончить со строго типизированными наборами результатов (не анонимными объектами) без написания множества кода. Однако я не вижу никакого способа придумать произвольное количество параметров типа - пока лучшее, что мне удалось сделать, - это создать один метод для двух наборов результатов, один для трех и так далее:
public async Task<dynamic> Get2Lists<T1, T2>(string proc, dynamic parameters)
{
await using var conn = new SqlConnection(connectionString);
var cmd = parameters == null ? new CommandDefinition(commandText: proc, commandType: CommandType.StoredProcedure) : new CommandDefinition(commandText: proc, commandType: CommandType.StoredProcedure, parameters: parameters);
var result = conn.QueryMultiple(cmd);
return new
{
Table1 = result.Read<T1>(),
Table2 = result.Read<T2>()
};
}
public async Task<dynamic> Get3Lists<T1, T2, T3>(string proc, dynamic parameters)
{
await using var conn = new SqlConnection(connectionString);
var cmd = parameters == null ? new CommandDefinition(commandText: proc, commandType: CommandType.StoredProcedure) : new CommandDefinition(commandText: proc, commandType: CommandType.StoredProcedure, parameters: parameters);
var result = conn.QueryMultiple(cmd);
return new
{
Table1 = result.Read<T1>(),
Table2 = result.Read<T2>(),
Table3 = result.Read<T3>()
};
}
Мне кажется, должен быть более элегантный способ - есть предложения?