Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dapper Reader Disposed Exception

Tags:

c#

dapper

I did extend the GridReader with the code below;

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

The reader has been disposed; this can happen after all data has been consumed

the pint here then when the method is called the reader reads all data in the first time but win the method is entered

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

this line give the exception above. so is there any way to keep dapper reader alive to except the query.

thanks in advance .

Note; the method is called like this

  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; });
like image 594
MuhanadY Avatar asked Oct 09 '13 11:10

MuhanadY


1 Answers

The QueryMultiple API is intended for queries that involve vertical partitions via multiple result grids, i.e. things like:

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

You are using horizontal partitions - you just need to use the Query<,,> API:

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

Or: re-structure the SQL to actually return multiple grids.

The reason it is throwing an exception is that your code is requesting a second grid that isn't there.

like image 76
Marc Gravell Avatar answered Oct 02 '22 20:10

Marc Gravell