如何将Dapper与Elastic Sc​​ale MultiShardConnection和MultiShardDataReader一起使用?

时间:2015-12-10 18:50:51

标签: dapper sharding azure-elastic-scale

我试图解析从Azure Elastic Sc​​ale MultiShardConnection返回的查询结果。它看起来不像是从SqlConnection或DbConnection继承,所以Dapper方法不可用。当你考虑它正在执行一起联合的扇出查询时,这是有意义的。我希望做的是使用现有的Dapper功能来处理读者结果的解析器到一个类型。

如果我没有将Dapper用于原始连接,那么这些映射功能是否可用?

以下是与我合作的类型:

MultiShardConnection : IDisposable
MultiShardCommand : DbCommand
MultiShardDataReader : DbDataReader, IDataReader, IDisposable, IDataRecord

这是一个示例查询,我尝试使用Dapper映射器。

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();
}

1 个答案:

答案 0 :(得分:2)

目前,MultiShardConnection未与Dapper集成。原因正如您指出的那样,它没有实现DbConnection。作为替代解决方案,我建议尝试弹性数据库查询(EDQ):https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-query-overview/。使用EDQ,您只需连接到Azure DB中的单个数据库,并通过EDQ外部表使用常规Dapper来查询分片。 EDQ现在可用于Azure SQL DB中的所有服务层。

告诉我们这对您有何帮助。

谢谢, 托