Exception Dapper Reader

c# dapper

Question

J'ai étendu l'extension GridReader avec le code ci-dessous;

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

Le lecteur a été disposé; cela peut arriver après que toutes les données ont été consommées

la pinte ici alors que la méthode est appelée le lecteur lit toutes les données dans la première fois, mais gagner la méthode est entrée

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

cette ligne donne l'exception ci-dessus. il y a donc un moyen de garder Dapper Reader en vie à l'exception de la requête.

Merci d'avance .

Remarque; la méthode est appelée comme ça

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

Réponse acceptée

L'API QueryMultiple est destinée aux requêtes impliquant des partitions verticales via plusieurs grilles de résultats , par exemple:

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

Vous utilisez des partitions horizontales - il vous suffit d'utiliser l'API Query<,,> :

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

Ou: restructurez le SQL pour retourner réellement plusieurs grilles.

La raison pour laquelle il lance une exception est que votre code demande une deuxième grille qui n'existe pas .




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