Как я могу использовать Dapper с Elastic Scale MultiShardConnection и MultiShardDataReader?
Я пытаюсь проанализировать результаты запроса, полученные из MultiShardConnection эластичной шкалы Azure. Похоже, он не наследуется от SqlConnection или DbConnection, поэтому методы Dapper недоступны. Это имеет смысл, если учесть, что он выполняет запрос разветвления, который объединен вместе. Я надеялся использовать существующие функциональные возможности Dapper, чтобы просто обрабатывать синтаксический анализатор результатов чтения для типа.
Доступны ли эти функции сопоставления, если я не использую Dapper для исходного соединения?
Ниже приведены типы, с которыми я работаю:
MultiShardConnection : IDisposable
MultiShardCommand : DbCommand
MultiShardDataReader : DbDataReader, IDataReader, IDisposable, IDataRecord
Вот пример запроса, в котором я пытаюсь использовать Dapper mapper.
Customer customer = null;
using (MultiShardConnection conn = GetMultiShardConnection())
using (MultiShardCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT * FROM [Customer] WHERE ...";
cmd.CommandTimeout = 120;
cmd.CommandTimeoutPerShard = 120;
using (MultiShardDataReader reader = await cmd.ExecuteReaderAsync())
{
while (reader.Read())
{
// Replace this with mapper...
customer = new Customer()
{
CustomerId = reader.GetInt32(0)
//etc...
};
}
}
}
return customer;
Обновить
В итоге мне нужно было использовать sp_execute_fanout
using (var con = GetConnection())
{
await con.OpenAsync();
return (await con.QueryAsync<Customer>("sp_execute_fanout ", new
{
shard_map_manager_server = "my_server.database.windows.net",
shard_map_manager_database = "my_shardmapmananger",
user_id = "my_username",
password = "my_password",
shard_map_name = "my_shardmap",
statement = "SELECT * FROM Customer"
}, commandTimeout: 120, commandType: CommandType.StoredProcedure)).FirstOrDefault();
}
2 ответа
В настоящее время MultiShardConnection не интегрируется с Dapper. Причина именно в том, что вы указываете, что он не реализует DbConnection. В качестве альтернативного решения я бы рекомендовал попробовать эластичный запрос к базе данных (EDQ): https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-query-overview/. С помощью EDQ вы можете просто подключиться к единой базе данных в базе данных Azure и использовать обычные Dapper для внешних таблиц EDQ для выполнения запросов через ваши шарды. EDQ теперь доступен на всех уровнях обслуживания в базе данных SQL Azure.
Дайте нам знать, как это работает для вас.
Спасибо Торстен
Я попробовал решение от OP сегодня, потому что я также хотел использовать Dapper для сопоставления результатов запроса из нескольких осколков, но я заметил, что sp_execute_fanout устарел и заменен sp_execute_remote.
Прежде чем вы сможете использовать этот sp, вам необходимо создать внешний источник в качестве ссылки на Shard Map Manager. Затем вы можете использовать имя этого внешнего источника в качестве имени источника данных (в моем примере «TestExtScr») и сделать что-то подобное в своем коде:
using (var con = new SqlConnection(connString))
{
return await con.QueryAsync<Customer>("sp_execute_remote", new
{
data_source_name = "TestExtSrc",
statement = "SELECT foo FROM bar"
}, commandTimeout: 120, commandType: CommandType.StoredProcedure);
}
Таким образом, вы можете использовать Dapper при запросе нескольких сегментов.
Я знаю, что поднимаю старый пост, но когда я искал решение своей проблемы, этот пост продолжал появляться. Поэтому я добавил этот бит на случай, если кто-то в будущем будет искать то же самое :).