2012-12-11 51 views
4

我的代码如下小巧玲珑的错误:一旦

try 
     { 
      SqlConnection mapperConnection = SqlAccessHelper.SqlHelper.GetOpenConnection(SqlConnectionHelper.SqlConnectionString()); 
      var parameters = new DynamicParameters(); 
      parameters.Add("@P_MarketId", marketId, DbType.Int32); 
      parameters.Add("@P_Output", dbType: DbType.Int32, direction: ParameterDirection.Output); 

      using (var multi = mapperConnection.QueryMultiple("USP_FetchMarketRecords", parameters, (SqlTransaction)null, 1000000, CommandType.StoredProcedure)) 
      { 
        IEnumerable<MarketRecord.FItem> FItem = multi.Read<MarketRecord.FItem>();       
        IEnumerable<MarketRecord.FSubsystem> FSubsystem = multi.Read<MarketRecord.FSubsystem>(); 
        objCResponseVO.addObject("FItem",FItem); 
        objCResponseVO.addObject("FSubsystem",FSubsystem); 
      } 
     } 
     catch (Exception ex) { 
      throw ex; 
     } 

第一次读优良每个网格只能进行迭代。第二次读取FSubsystem给我例外:“每个网格只能迭代一次”。这里有什么不对? 在第二次读取时,我在公共IEnumerable Read()方法中追踪它的消耗属性为true。我怎么能克服这一点?

+0

可能是有益的,看看你的存储过程是什么样子。 –

+0

我的SP只有2个选择查询。 –

回答

5

底层的数据读取器是唯一的转发设备;通过第二次呼叫Read,您将移动到下一个网格。您应该以前瞻性方式消费每个网格。例如,你可以重新排列声明:

using (var multi = mapperConnection.QueryMultiple("USP_FetchMarketRecords", 
    parameters, (SqlTransaction)null, 1000000, CommandType.StoredProcedure)) 
{ 
     IEnumerable<MarketRecord.FItem> FItem = 
      multi.Read<MarketRecord.FItem>();       
     objCResponseVO.addObject("FItem",FItem); 

     IEnumerable<MarketRecord.FSubsystem> FSubsystem = 
      multi.Read<MarketRecord.FSubsystem>();    
     objCResponseVO.addObject("FSubsystem",FSubsystem); 
} 

或者你可以缓冲:

using (var multi = mapperConnection.QueryMultiple("USP_FetchMarketRecords", 
    parameters, (SqlTransaction)null, 1000000, CommandType.StoredProcedure)) 
{ 
     IEnumerable<MarketRecord.FItem> FItem = 
      multi.Read<MarketRecord.FItem>().ToList(); 
     IEnumerable<MarketRecord.FSubsystem> FSubsystem = 
      multi.Read<MarketRecord.FSubsystem>().ToList(); 
     objCResponseVO.addObject("FItem",FItem); 
     objCResponseVO.addObject("FSubsystem",FSubsystem); 
} 
+0

重新排序没有工作。只要我写IEnumerable FItem = multi.Read (); IEnumerable FSubsystem = multi.Read (); 也没有工作。然而第二个选项工作正常。我可以知道为什么吗? –

+0

但转换为tolist会消耗一些时间。直接绑定到相同的类对象。 –

+0

@KuntadyNithesh你能定义“没有工作”吗? –

1

我刚刚通过类似的问题。我的是Postgresql而不是SQL Server,但我认为这种情况并不重要。

在结果的末尾添加一个ToList()就有诀窍。希望它也适合你。

  string sql = @" 
        select * from usuario where [email protected]; 

        select idarea 
        from areausuario 
        where idusuario = @id; 

        select * from area; 
        "; 


     var res = this.Connection.QueryMultiple(sql, p); 

     var usuarioData = res.Read<Entities.Usuario>().First(); 
     var areasSelected = res.Read<int>().ToList(); 
     var areas = res.Read<Entities.CatalogoPadreSelection>().ToList();