Dapper Reader Disposed Exception

c# dapper

Pregunta

Extendí el GridReader con el siguiente código;

 /// <summary>
/// 
/// </summary>
public static class Extentions
{
    /// <summary>
    /// Maps the specified reader.
    /// </summary>
    /// <typeparam name="TFirst">The type of the first.</typeparam>
    /// <typeparam name="TSecond">The type of the second.</typeparam>
    /// <typeparam name="TKey">The type of the key.</typeparam>
    /// <param name="reader">The reader.</param>
    /// <param name="firstKey">The first key.</param>
    /// <param name="secondKey">The second key.</param>
    /// <param name="addChildren">The add children.</param>
    /// <returns></returns>
    public static IEnumerable<TFirst> Map<TFirst, TSecond, TKey>
 (
 this Dapper.SqlMapper.GridReader reader,
 Func<TFirst, TKey> firstKey,
 Func<TSecond, TKey> secondKey,
 Action<TFirst, IEnumerable<TSecond>> addChildren
 )
    {
        var first = reader.Read<TFirst>().ToList();
        var childMap = reader
            .Read<TSecond>()
            .GroupBy(s => secondKey(s))
            .ToDictionary(g => g.Key, g => g.AsEnumerable());

        foreach (var item in first)
        {
            IEnumerable<TSecond> children;
            if (childMap.TryGetValue(firstKey(item), out children))
            {
                addChildren(item, children);
            }
        }

        return first;
    }
}

El lector ha sido eliminado; esto puede suceder después de que se hayan consumido todos los datos

la pinta aquí, entonces, cuando se llama el método, el lector lee todos los datos en la primera vez pero gana el método se ingresa

var first = reader.Read<TFirst>().ToList();

esta línea da la excepción anterior. entonces hay alguna forma de mantener vivo el lector apuesto excepto la consulta.

gracias por adelantado .

Nota; el método se llama así

  var sql = (@"SELECT *  
                              FROM [pubs].[dbo].[authors] as a
                              right join pubs.dbo.titleauthor as b 
                              ON a.au_id = b.au_idT");

        var data = connection.QueryMultiple(sql).Map<authors, titleauthor, string>(
            au => au.au_id,
            tit => tit.au_idT,
            (au, tits) => { au.titleauthor = tits; });

Respuesta aceptada

La API QueryMultiple está destinada a consultas que involucran particiones verticales a través de múltiples cuadrículas de resultados , es decir, cosas como:

select * from Parent where Id = @id;
select * from Child where ParentId = @id;

Está utilizando particiones horizontales ; solo necesita usar la API Query<,,> :

var records = connection.Query<TFirst, TSecond, TFirst>(...);

O bien, vuelva a estructurar el SQL para devolver realmente varias cuadrículas.

La razón por la que arroja una excepción es que su código está solicitando una segunda grilla que no está allí .



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow