2010-05-12 5 views
4

표현 트리를 선언 할 수 있습니다.일반 코드의 표현 트리

그러나 메서드 나 속성 getter와 같은 코드의 일반 청크에 대해 표현식 트리를 가져올 수 있습니까?

은 내가,의는 주문 처리 시스템에 대한 말을 할 수있다 할 노력하고있어, 나는 주문 항목에 대한 클래스가 있습니다

class Item : Entity 
{ 
    [Cascade] 
    public Document document { get; set; } 
    public int line { get; set; } 

    public Product product { get; set; } 
    public string description { get; set; } 
    public decimal qty { get; set; } 
    public decimal price { get; set; } 
    public decimal net 
    { 
     get 
     { 
      return qty * price; 
     } 
    } 
    public VatCode vat_code { get; set; } 
} 

순 값이 수량 * 가격과 동일, 그래서 내가 좋아하는 것 프로퍼티 또는 메소드와 함께 선언하고 프레임 워크가 해당 표현식을 인트로 스페어 화하여 해당 데이터베이스 뷰에서 해당 계산 된 열을 정의하기위한 적절한 SQL을 생성 할 수 있습니다.

이 작업을 수행하는 가장 확실한 방법은 속성 가져 오기 도구 또는 메서드에 대한 식 트리를 가져 오는 것이지만이 작업을 수행하는 방법을 찾을 수 없거나 가능하다는 것을 알 수 없습니다. (메서드 본문을 바이트 스트림으로 가져 오는 방법을 찾았지만 여기서 원하는 것은 아닙니다.)

이것이 가능하지 않은 경우 권장되는 솔루션은 다음과 같은 정적 필드를 선언하는 것입니다. 표현식 트리이며, 내부적으로 사용하기 위해 런타임에 컴파일/실행하고, SQL 생성을 위해 일반적으로 인트로 스펙트를 수행합니까?

답변

1

아니요, 불가능합니다 - 일반 코드는 바이트 코드이므로이를 표현 트리로 변환 할 수있는 메커니즘이 없습니다. 리플렉션을 사용하면 무엇을 할 수 있습니까?하지만 기본적으로 그 것입니다.

1

나는 전에도 비슷한 것을 찾고 있었고, 이것을하기에 완벽한 방법을 찾지 못했습니다. ... 그렇지 간단하고 쉬운 일이다

- 당신이로 실행할 수

다른 문제는, 당신이 LINQ 쿼리에 주입 싶어하는 식 트리를해야합니다 경우에도 것입니다

이 작업을 수행하는 한 가지 방법은 "net"을 가져 오는 정적 표현식을 저장하고 "net"속성의 getter가 this에 대해이 식을 실행하도록하는 것입니다.

그리고 일반 linq 쿼리에서 식을 삽입하는 방법? 그것에 대해 blog post을 작성했습니다. 기본적으로 L2S 표현식 트리를 사용자 지정 식으로 업데이트하는 익스프레션 익스텐더를 만듭니다. Extending LINQ selectors with custom expressions