Dapper는 Linq 작업 이전에 데이터베이스에서 전체 객체를 요청합니까?

dapper dapper-contrib linq sql-server

문제

Dapper (또는 다른 ORM)가 LINQ와 결합 할 때 객체 검색을 처리하는 방법에 대해 잠깐 궁금해했습니다.

내가 이런 수업을하는 경우 :

public static IEnumerable<SitePage> GetAll()
{
    using (IDbConnection cn = new SqlConnection(g.Global.CONX))
    {
        cn.Open();
        return cn.GetAll<SitePage>();
    }
}

그리고 나는 다음과 같은 쿼리를 생성한다.

var result = SitePage.GetAll().Select(c=> new { c.id, c.PageUrl, c.ParentId });

나는 백그라운드에서 전체 레코드 집합이 다른 모든 열 (정말로 큰 varchars를 포함 할 수 있음)을 포함하여 가져 오는지 궁금하거나 Dapper가이 쿼리에서 SQL db로부터 요청하는 열만 끌어 당기는 것을 이해합니까? 나는 그것이 새내기라고 생각하지만, Dapper / LINQ 상호 작용을 더 잘 이해하고 싶습니다.

비슷한 질문이 여기에 게시되었습니다 : 선택 특정 컬럼 - 사용 - linq - 어떻게 - 전송 - 옮겨 봤는지 모르겠지만 . 포스터에는 2 개의 질문이 있고, 또한 일반적으로 선호하는 람다 식을 사용하지 않았습니다.

이것에 대한 대답은 내 마음이 화를 낼 것이다. (그리고 내가 코딩을하는 방식을 아주 바꿀 수도있다. 신중하다. 명시적인 SQL을 통해 너무 많은 코드를 작성하고있는 것 같다.)

수락 된 답변

Dapper는 람다 식을 SQL로 변환하지 않으므로 Dapper가 생성하는 SQL 쿼리는 SitePage 전체 인스턴스를 반환합니다.

Dapper의 GetAll<T> 메소드의 서명을 살펴 본다면이 경우를 빠르게 알 수 있습니다. IEnumerable<T> 반환하기 때문에 T 의 컬렉션을 반환한다는 것을 의미하므로 그 후에 사용하는 모든 연산자 (예 : Select 경우)가 전체 컬렉션에 적용됩니다. 즉 GetAll<T> 호출 한 후에는 더퍼 세계에 더 이상 있지 않습니다.

과거에 본격적인 ORM을 사용했다면 Entity Framework 나 NHibernate와 같은 더 많은 기능이 반드시 필요한 것은 아닙니다. 일부 API는 아직 IQueryable<T> 반환하지 않는 것을 알 수 있습니다. 실행되었습니다. 따라서 SelectWhere 와 같은 IQueryable<T> 에서 사용하는 연산자는 실제로 쿼리를 수정합니다. ORM은 iterating 또는 ToList 또는 ToArray 를 호출하여 쿼리를 구체화하면 쿼리 식 트리를 SQL로 변환하고 해당 쿼리를 데이터베이스로 보냅니다.



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