2009-09-15 4 views

답변

7

Expression<T>은 거의 모두 LINQ에 사용되지만 이되지 않습니다. LINQ 내에서는 일반적으로 코드로 표현 된 논리를 "캡처"하지만 데이터에 유지합니다. 그런 다음 해당 데이터를 LINQ 공급자가 검토하고 적절하게 처리 할 수 ​​있습니다 (예 : 그것을 SQL로 변환합니다. 일반적으로 LINQ의 식 트리는 람다 식 또는 쿼리 식의 컴파일러에서 만들어 지지만 다른 경우에는 직접 API를 직접 사용하는 것이 좋습니다. 다른 곳의

몇 가지 예 나는 그것을 사용하고 사용 본 적이 : MiscUtil에서

  • 를 마크 Gravell는 "일반적인 산술"을 구현하기 위해 그것을 사용 - 유형이 해당 운전자가있는 경우, 그 수 일반적으로 사용된다.
  • UnconstrainedMelody에서 나는 쿼리를 사용 Visual LINQ에서
  • 을 자신의 내부 형식에 관계없이, 플래그 열거 형에 대한 작업을 수행 (때문에 longulong 데, 당신이 예상하는 것보다 까다 롭습니다 다른 범위)과 유사한 방식으로 그것을 사용 LINQ를 "애니메이트"하는 표현식을 사용하면 무슨 일이 일어나는지 알 수 있습니다. 분명히 이것이 LINQ 사용이지만, 논리를 다른 형식으로 변환하는 전통적인 형식이 아닙니다.
+0

여기서 'VisualLINQ'를 볼 수 있습니까? – flesh

+0

죄송합니다. 블로그 게시물 링크가 포함되었습니다. 잠시만 기다려주십시오 ... –

0

my answer to another SO question 코드 뒤에 & 앞에 내보십시오.

요약 : Expression<>는 코드를 크게 단순화하고, 이해하기 쉽도록 만들고, 심지어는 팬텀 버그를 수정했습니다.

4

LINQ의 관점에서 볼 때 런타임에보다 다양한 LINQ 쿼리를 만들 수있는 방법은 순전히 lambdas에서 수행 할 수있는 것보다 많습니다.

DynamicMethod 및 IL 대신에 마이크로 컴파일러로 Expression을 여러 번 사용했습니다. 이 방법은 .NET 4.0 (as discussed on InfoQ)에서 강한 얻을 수 있지만, 심지어 3.5에서 당신이 할 수있는 일의이 많이있다 (일반적으로 런타임 데이터를 기반으로, 구성 등) :

나는 또한 WO 일부에 대한 수학 엔진의 일부로 사용 rk Microsoft와 함께했습니다. 즉, 수학 표현식 ("(x + 12) * y = z"등)을 Expression 트리로 구문 분석하고 컴파일하여 실행합니다.

또 다른 intersting 사용 (제이슨 Bock, here에 의해 설명) 유전 프로그래밍입니다; 후보자를 Expression 나무로 만들고, 신속하게 (Compile() 이후) 실행하는 데 필요한 코드가 있어야하지만, 중요한 것은 (유전 프로그래밍의 경우) 조각을 교환하는 것입니다.

+0

Microsoft 용 코드는 어디에서나 볼 수 있습니까? 나는이 종류의 물건의 몇 가지 예를보고 싶다. – flesh

+0

사본이 있지만 "현 상태 그대로"게시하는 것은 현명하지 않을 것이라고 생각한다. (내 고용주와 Microsoft가 공동 소유하고있다.). 처음부터 다시해야 할 시간을 찾으려고 노력할 것입니다. 그리 많지는 않지만 Microsoft의 독서 본부로가는 길에 기차에서 원본을 썼습니다. –

관련 문제