2015-12-10 32 views
1

我想解析从Azure弹性秤MultiShardConnection返回的查询结果。它看起来不像它从SqlConnection或DbConnection继承,所以Dapper方法不可用。当你认为它正在执行联合在一起的扇出查询时,这是有意义的。我希望做的是使用现有的Dapper功能来将阅读器结果的解析器处理为一种类型。如何在Elastic Sc​​ale 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(); 
} 

回答

2

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

让我们知道如何为你工作。

感谢, 托斯滕

+0

感谢托斯滕为轻推我考虑的选择!我们最终使用Dapper调用了sp_execute_fanout,而不是使用外部表。 我们不希望在将来的查询需要连接时创建额外的外部表。另外,我们没有一个外部桌子的好家。您能否提供一些见解,为什么不建议将自定义表添加到ShardMapManager数据库本身? 它似乎是一个很好的地方存储我们的外部表,这些表将用于扇出查询。否则,我们需要为这些创建一个新的“核心”数据库。 – Vyrotek

+0

由于ShardMapManager数据库是常规数据库,因此将外部表放入ShardMapManager数据库中就好了。使用扇出也是一种好方法,只要您不需要在应用中对UNION ALL结果进行任何广泛的后处理即可。 –