我想解析从Azure弹性秤MultiShardConnection返回的查询结果。它看起来不像它从SqlConnection或DbConnection继承,所以Dapper方法不可用。当你认为它正在执行联合在一起的扇出查询时,这是有意义的。我希望做的是使用现有的Dapper功能来将阅读器结果的解析器处理为一种类型。如何在Elastic Scale MultiShardConnection和MultiShardDataReader中使用Dapper?
如果我不使用Dapper进行原始连接,那些映射功能是否可用?
下面是我的工作类型:
MultiShardConnection : IDisposable
MultiShardCommand : DbCommand
MultiShardDataReader : DbDataReader, IDataReader, IDisposable, IDataRecord
这里就是我试图用小巧玲珑的映射器的例子查询。
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();
}
感谢托斯滕为轻推我考虑的选择!我们最终使用Dapper调用了sp_execute_fanout,而不是使用外部表。 我们不希望在将来的查询需要连接时创建额外的外部表。另外,我们没有一个外部桌子的好家。您能否提供一些见解,为什么不建议将自定义表添加到ShardMapManager数据库本身? 它似乎是一个很好的地方存储我们的外部表,这些表将用于扇出查询。否则,我们需要为这些创建一个新的“核心”数据库。 – Vyrotek
由于ShardMapManager数据库是常规数据库,因此将外部表放入ShardMapManager数据库中就好了。使用扇出也是一种好方法,只要您不需要在应用中对UNION ALL结果进行任何广泛的后处理即可。 –