... | ... | @@ -228,11 +228,11 @@ Array.ForEach(enumList.ToArray(), (elem) => { Console.WriteLine(elem); }); |
|
|
|
|
|
Expression 객체의 인스턴스 데이터의 역할을 하는 람다 식.
|
|
|
|
|
|
Expression 객체는 데이터를 트리 자료구조 형태로 담고 있다. (Expression Tree)
|
|
|
Expression 객체는 데이터를 트리 자료구조 형태로 담고 있다. (Expression tree)
|
|
|
|
|
|
Expression.Compile : 데이터로 담겨 있는 람다 식은 컴파일이 가능함, 이 메서드는 델리게이트를 반환하고 따라서 함수 호출이 가능함.
|
|
|
|
|
|
람다 식을 직접 구성하여 Expression Tree를 구성할 수 있음.
|
|
|
람다 식을 직접 구성하여 Expression tree를 구성할 수 있음.
|
|
|
|
|
|
여러가지 메서드를 제공함 (Expression 타입의 팩토리 메서드, System.Linq.Expressions에 정의)
|
|
|
|
... | ... | @@ -243,7 +243,7 @@ Expression.Compile : 데이터로 담겨 있는 람다 식은 컴파일이 가 |
|
|
참고 : ExpressionTreeVisualizer (http://msdn.microsoft.com/ko-kr/library/bb397975(v=vs.90).aspx)
|
|
|
- Body : expression의 몸체를 리턴한다.
|
|
|
- Parameters : 람다식의 파라미터를 리턴한다.
|
|
|
- NodeType : Expression trees의 특정노드의 ExpressionType을 리턴한다. ExpressionType은 45가지의 값을 가진 열거형타입인데, Expression trees에 속할 수 있는 모든 노드의 목록이 포함되어 있다. 예를 들면, 상수를 리턴하거나, 파라미터를 리턴한다거나, 둘 중에 뭐가 더 큰지 결정한다거나 (<,>), 두 값을 더한다거나(+) 하는 것들이 있다.
|
|
|
- NodeType : Expression tree의 특정노드의 ExpressionType을 리턴한다. ExpressionType은 45가지의 값을 가진 열거형타입인데, Expression tree에 속할 수 있는 모든 노드의 목록이 포함되어 있다. 예를 들면, 상수를 리턴하거나, 파라미터를 리턴한다거나, 둘 중에 뭐가 더 큰지 결정한다거나 (<,>), 두 값을 더한다거나(+) 하는 것들이 있다.
|
|
|
- Type : expression의 정적인 타입을 리턴한다.
|
|
|
|
|
|
#### LINQ (Language INtegrated Query)
|
... | ... | @@ -285,8 +285,8 @@ public interface IQueryable : IEnumerable |
|
|
```
|
|
|
|
|
|
멤버로 Expression타입의 프로퍼티를 가지고 있다.
|
|
|
IQueryable의 인스턴스는 expression tree를 가지고 있도록 설계됨.
|
|
|
그 expression tree가 코드로 작성한 LINQ 쿼리문의 자료구조다.
|
|
|
IQueryable의 인스턴스는 Expression tree를 가지고 있도록 설계됨.
|
|
|
그 Expression tree가 코드로 작성한 LINQ 쿼리문의 자료구조다.
|
|
|
|
|
|
SQL 쿼리는 실제로 데이터베이스 서버에서 실행되기 때문에, 데이터베이스가 알아들을 수 있는 형태로 변환을 해야한다.
|
|
|
예를 들면,
|
... | ... | @@ -311,13 +311,13 @@ public interface IEnumerable<T> : IEnumerable |
|
|
}
|
|
|
```
|
|
|
|
|
|
즉, Expression타입의 프로퍼티가 없다.
|
|
|
즉, Expression 타입의 프로퍼티가 없다.
|
|
|
왜냐면, LINQ eo Objects는 같은 프로세스내에서 처리될 객체들을 대상으로 쿼리를 하기 때문에 다른 형태로 변환될 필요가 없기 때문이다.
|
|
|
|
|
|
그렇다면, 굳이 expression tree 같은 자료구조로 변환할 필요가 없으니 대략 아래와 같은 규칙이 성립한다.
|
|
|
그렇다면, 굳이 Expression tree 같은 자료구조로 변환할 필요가 없으니 대략 아래와 같은 규칙이 성립한다.
|
|
|
|
|
|
- 코드가 같은 프로그램(또는 프로세스)내에서 실행되는 경우라면 IEnumerable<T>
|
|
|
- 쿼리 표현식을 다른 프로그램(또는 프로세스)에서 처리하기 위해서 문자열 형태로 변환해야 한다면 expression tree를 포함하는 IQueryable<T>를 사용
|
|
|
- 쿼리 표현식을 다른 프로그램(또는 프로세스)에서 처리하기 위해서 문자열 형태로 변환해야 한다면 Expression tree를 포함하는 IQueryable<T>를 사용
|
|
|
|
|
|
|
|
|
#### LINQ
|
... | ... | |