복붙노트

[SQL] 어떻게 말끔를 사용하여 효율적으로 집계 개체를 선택합니까?

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

말끔를 사용하여, 어떤 데이터베이스에 테이블에서 다음을 채울 수있는 가장 좋은 방법입니다 (내 경우에 그것의 포스트 그레스을하지만 그건 문제가 안). 이 예에서 테이블 개체 모델에 하나 거의 하나입니다. 각 하위 개체에 대한 외래 키 관계를 나타내는 클래스의 Items 속성. 즉, 표 3, A가 B와 많은 관계 하나를 가지고, B는 C. 가진 많은 관계 하나를 가지고

그래서 A I의 특정 ID에 대한 내 객체가 아니라 모든 하위 데이터를 갖고 싶어.

내 추측은 어떻게 든 QueryMultiple를 사용해야하지만, 나는 확실히 그것을 할 수있는 최선의 방법 아니다는 것이다.

해결법

  1. ==============================

    1.멀티 매퍼 객체 계층 구조를 만들기 위해 도움이 될 수 있습니다 : 내가 여기 제안 도우미가 생각합니다.

    멀티 매퍼 객체 계층 구조를 만들기 위해 도움이 될 수 있습니다 : 내가 여기 제안 도우미가 생각합니다.

    var mapped = cnn.QueryMultiple(sql)
       .Map<A,B,A>
        (
           A => A.ID, 
           B => B.AID,
           a, bees => { A.Items = bees};  
        );
    

    당신이 매퍼와 GridReader 및 확장 가정 :

    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 계층 구조로 작업이 패턴을 확장 할 수 있습니다.

  2. from https://stackoverflow.com/questions/6146918/how-do-i-select-an-aggregate-object-efficiently-using-dapper by cc-by-sa and MIT license