Erreur Dapper: chaque grille ne peut être itérée qu'une seule fois

dapper

Question

Mon code est comme ci-dessous

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

première lecture, c'est bien. La deuxième lecture de FSubsystem me donne l’exception "Chaque grille ne peut être itérée qu’une fois". Qu'est-ce qui ne va pas ici? Lorsque je l'ai tracé en public, la méthode IEnumerable Read () lors de la deuxième lecture de la propriété consommée est vraie. Comment puis-je surmonter cela?

Réponse acceptée

Le lecteur de données sous-jacent est un périphérique à transfert uniquement en appelant Read une deuxième fois, vous déplacez le lecteur vers la grille suivante . Vous devriez consommer chaque grille uniquement dans le sens inverse. Par exemple, vous pouvez réorganiser les instructions:

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

Ou vous pourriez tamponner:

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

Réponse populaire

Je viens de traverser un problème similaire. Le mien est Postgresql au lieu de SQL Server mais je pense que cela n'a pas d'importance dans ce cas.

L'ajout d'une ToList () à la fin du résultat a fait l'affaire. J'espère que cela fonctionne pour vous aussi.

            string sql = @"
                    select * from usuario where id=@id;

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi