대용량 판독기 처리 예외

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

독자는 처분되었다. 이것은 모든 데이터가 소비 된 후에 발생할 수 있습니다.

여기에 파인트 때 메서드가 호출 될 때 처음으로 모든 데이터를 읽지 만 방법을이기는 리더가 입력됩니다

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

이 행은 위의 예외를 제공합니다. 그래서 쿼리를 제외하고는 dapper reader를 살아있게 할 수있는 방법이 있습니다.

미리 감사드립니다.

노트; 이 메소드는 다음과 같이 호출됩니다.

  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을 재구성하여 실제로 여러 그리드를 반환합니다.

예외를 던지는 이유는 코드에서 두 번째 모눈을 요청하고 있기 때문 입니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.