ダッパーリーダーの例外の例外

c# dapper

質問

私は以下のコードでGridReaderを拡張しました。

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

読者は処分されました。これは、すべてのデータが消費された後に発生する可能性があります

ここにpintメソッドが呼び出されたときに、リーダーは最初にすべてのデータを読み込みますが、メソッドを獲得する方法が入力されます

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

この行には上記の例外があります。クエリを除いて、大胆な読者を生かし続ける方法はありますか?

前もって感謝します 。

注意;このメソッドはこのように呼び出されます

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

受け入れられた回答

QueryMultiple APIは、 複数の結果グリッド 、つまり以下のような垂直パーティションを含むクエリを対象としています

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

水平パーティションを使用しています - Query<,,> APIを使用するだけです:

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

または、実際に複数のグリッドを返すようにSQLを再構成します。

例外をスローしている理由は、コードがそこにない 2番目のグリッドを要求しているからです。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow