Dapper를 사용하여 집계 객체를 효율적으로 선택하려면 어떻게해야합니까?

c# dapper sql

문제

집합체를 구성하는 일련의 객체가 있다고 가정 해 보겠습니다.

public class C{
 public string Details {get;set;}
}

public class B{
  public string Details {get;set;}
  public List<C> Items {get;set;}
}

public class A{
  public long ID {get;set;}
  public string Details {get;set;}
  public List<B> Items {get;set;}
}

Dapper를 사용하여 데이터베이스의 테이블에서 이들을 채우는 가장 좋은 방법은 무엇입니까 (제 경우에는 포스트 그레스이지만 중요한 것은 아닙니다). 예제의 표는 객체 모델과 관련된 표입니다. 각 하위 개체에 대한 외래 키 관계를 나타내는 클래스의 Items 속성입니다. 즉 3 개의 테이블, A는 B와 일대 다 관계를 가지고 B는 C와 일대 다 관계를가집니다.

따라서 AI의 주어진 ID에 대해 내 객체가 모든 하위 데이터를 갖기를 원합니다.

내 생각 엔 QueryMultiple을 어쨌든 사용해야하지만 최선의 방법을 잘 모르겠습니다.

수락 된 답변

나는 여기에서 제안하는 도우미라고 생각한다 : 객체 계층 구조를 만드는 다중 매퍼 가 도움이 될 수있다.

public static IEnumerable<TFirst> Map<TFirst, TSecond, TKey>
    (
    this 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;
}

GridReader와 매퍼 (mapper)를 확장한다고 가정합니다.

public static IEnumerable<TFirst> Map<TFirst, TSecond, TKey>
    (
    this 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;
}

이 패턴을 확장하여 3 레벨 계층 구조로 작업 할 수 있습니다.




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