C# Academy · 강의

LINQ 공급자의 식 트리

공급자가 식을 쿼리로 변환하는 방식을 살펴봅니다.

레슨 4/413개 단계

LINQ 공급자의 식 트리은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

LINQ에 식 트리가 필요한 이유

LINQ에는 두 가지 방식이 있습니다. IEnumerable<T>은 메모리에서 람다를 실행합니다. IQueryable<T>은 람다를 식 트리로 받아 공급자가 SQL과 같은 다른 언어로 변환할 수 있게 합니다.

IEnumerable과 IQueryable 비교

차이는 매개변수 형식에 있습니다. IEnumerable.Where는 Func<T,bool>(컴파일된 코드)을 받고, IQueryable.Where는 Expression<Func<T,bool>>(트리)을 받습니다.

using System;
using System.Linq;
using System.Linq.Expressions;

int[] nums = { 1, 2, 3, 4 };
// IEnumerable path: lambda is a compiled delegate
var evens = nums.Where(n => n % 2 == 0);
Console.WriteLine(string.Join(",", evens)); // 2,4

쿼리는 데이터로 유지됩니다

IQueryable을 사용하면 람다가 식 트리로 캡처되며 아직 실행되지 않습니다. 공급자는 쿼리를 만들기 위해 트리를 검사합니다.

using System;
using System.Linq;
using System.Linq.Expressions;

IQueryable<int> q = new[] { 1, 2, 3, 4, 5 }.AsQueryable();
var filtered = q.Where(n => n > 2);
Console.WriteLine(filtered.Expression.NodeType); // Call (a method-call tree)

쿼리 식 검사하기

쿼리 가능 객체의 Expression 속성을 통해 공급자가 변환할 트리를 확인할 수 있습니다.

using System;
using System.Linq;

var q = new[] { 10, 20, 30 }.AsQueryable().Where(x => x >= 20);
Console.WriteLine(q.Expression.ToString().Contains("Where")); // True

실행이 아닌 번역

Entity Framework와 같은 공급자는 트리를 순회하고 WHERE Age > 18과 같은 SQL을 생성합니다. C# 조건자는 클라이언트에서 실행되지 않으며 데이터베이스가 작업을 수행합니다.

IQueryProvider의 역할

IQueryable은 IQueryProvider를 보유합니다. 쿼리를 열거하면 공급자가 식 트리를 받고 실행 방법을 결정합니다.

using System;
using System.Linq;

var q = new[] { 1, 2, 3 }.AsQueryable();
Console.WriteLine(q.Provider.GetType().Name); // EnumerableQuery (the in-memory provider)

지연 실행

트리는 열거할 때(예: ToList, foreach)에만 변환되고 실행됩니다. 그전까지는 계속 조합할 수 있는 순수한 데이터입니다.

using System;
using System.Linq;

var q = new[] { 1, 2, 3, 4 }.AsQueryable()
    .Where(n => n > 1)
    .Select(n => n * 10);
// nothing has run yet; now force it:
Console.WriteLine(string.Join(",", q.ToList())); // 20,30,40

쿼리 구성하기

각 연산자가 식 트리에 추가되므로 쿼리를 여러 단계로 만들 수 있으며, 실행 시 공급자는 전체 쿼리를 확인합니다.

using System;
using System.Linq;

var baseQuery = new[] { 5, 15, 25, 35 }.AsQueryable();
var q = baseQuery.Where(n => n > 10);
q = q.Where(n => n < 30); // composed: 10 < n < 30
Console.WriteLine(string.Join(",", q.ToList())); // 15,25

번역할 수 없는 것

공급자는 자신이 이해하는 연산만 번역할 수 있습니다. 임의의 C# 메서드를 호출하는 조건자는 이에 대응하는 SQL이 없으므로 실행 시 예외를 발생시킬 수 있습니다.

직접 공급자 작성하기

사용자 지정 공급자는 IQueryProvider를 구현하고 ExpressionVisitor를 사용하여 트리를 순회하면서 각 노드를 대상 쿼리 언어로 변환합니다.

종합하기

여기서 핵심은 같은 람다가 IEnumerable에서는 델리게이트이고 IQueryable에서는 트리이므로 변환이 가능하다는 점입니다.

using System;
using System.Linq;
using System.Linq.Expressions;

Expression<Func<int, bool>> predicate = n => n > 2;
var data = new[] { 1, 2, 3, 4 };
// IEnumerable needs a delegate:
Console.WriteLine(string.Join(",", data.Where(predicate.Compile()))); // 3,4
// IQueryable accepts the tree directly:
Console.WriteLine(string.Join(",", data.AsQueryable().Where(predicate))); // 3,4

빠른 확인

식 트리가 LINQ 공급자에서 어떤 역할을 하는지 확인해 보십시오.

복습

LINQ 공급자가 식 트리를 사용하는 방식을 배웠습니다.

  • IEnumerable은 컴파일된 Func를 사용하고, IQueryable은 Expression<Func> 트리를 사용합니다.
  • 공급자는 트리를 실행하는 대신 (예: SQL로) 변환합니다.
  • 실행은 열거할 때까지 지연됩니다.
  • 변환할 수 있는 연산만 작동하며, 임의의 메서드는 실패할 수 있습니다.
무료로 시작

AI 튜터와 함께 C#을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
93
레슨
346

자주 묻는 질문

“LINQ 공급자의 식 트리” 강의는 무료인가요?

네 — “LINQ 공급자의 식 트리” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“LINQ 공급자의 식 트리”에서 뭘 배우나요?

공급자가 식을 쿼리로 변환하는 방식을 살펴봅니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“LINQ 공급자의 식 트리” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 식 트리란 무엇인가
  2. 수동으로 식 만들기
  3. 식 컴파일 및 실행
  4. LINQ 공급자의 식 트리
← C# Academy(으)로 돌아가기