2013-02-27 1 views
3

나는 더 새로운 코더이며 다음과 같은 lamdba 표현식을 표현식을 사용하여 동적으로 생성하는 데 많은 문제가있다. 나무. (x, y) => DateTime.Compare (y.EFFECTIVE_DATE, x.EFFECTIVE_DATE)와 같은 동적 표현식은 어떻게 만듭니 까?

(x, y) => DateTime.Compare(y.EFFECTIVE_DATE, x.EFFECTIVE_DATE) 

난 그냥 식 나무의 기초를 이해하기 시작하고 있지만이를 만들 정도로 알고하지 못하는 것 같습니다. 솔직히 나는 이걸 가지고 정말 멍청하기 때문에 진짜로 여기에 올릴 수있는 좋은 코드가 없습니다. 어떤 도움이라도 좋을 것입니다.

미리 감사드립니다.

죄송합니다. 처음으로 글을 올리거나 항목을 서식 지정하는 데 문제가 있습니다.

그래서, 내 주요 방법 나는 다음과 같습니다

var에 sortExpression = testing.GetExpression ("EFFECTIVE_DATE", "EFFECTIVE_DATE");

 if (e.SortDirection == SortDirection.Ascending) 
     { 
      paymentAuthorizationList.Sort(sortExpression); 
     } 

그리고, 내 가져 오기 표현 방법에 :

public Expression<Func<AuthorizePayments, AuthorizePayments, int >> GetExpression<t>(string propertyName, string propertyValue) 
    { 

     var paramX = Expression.Parameter(typeof(AuthorizePayments), "x"); // x 
     var paramY = Expression.Parameter(typeof(AuthorizePayments), "y"); // y 

     var xDate = Expression.Property(paramX, "EFFECTIVE_DATE"); // x.EFFECTIVE_DATE 
     var yDate = Expression.Property(paramY, "EFFECTIVE_DATE"); // y.EFFECTIVE_DATE 

     // DateTime.Compare(y.EFFECTIVE_DATE, x.EFFECTIVE_DATE) 
     var body = Expression.Call(typeof(DateTime).GetMethod("DateTime.Compare"), yDate, xDate); 

     // (x, y) => DateTime.Compare(y.EFFECTIVE_DATE, x.EFFECTIVE_DATE) 
     var expr = Expression.Lambda<Func<AuthorizePayments, AuthorizePayments, int >>(body, paramX, paramY); 

반환 EXPR; }

이 시점에서 변수가 잘못되었음을 알고 있습니다. 정렬 식에는 정렬식이 적용되지 않습니다.

내가 뭘 하려는지 근거가 없습니까?

내 무지와 도움에 대한 죄송합니다. 당신이 "손으로"그렇게하려는 경우

Expression<Func<Foo, Foo, int>> expr = 
      (x, y) => DateTime.Compare(y.EFFECTIVE_DATE, x.EFFECTIVE_DATE); 

:

+0

내가 내가이 모든 일을 잘못했는지 궁금해. 내가 뭘하려고 그리드에 대한 정렬 표현을 빌드하는 것입니다. 내 데이터 소스로 List 을 사용하고 있습니다. 필자는 목록을로드하고 정렬 한 다음 그리드에 리 바인드해야한다는 것을 이해합니다. 정렬 할 여러 열이 있기 때문에 동적으로 식을 작성하는 메서드를 작성하려고했습니다. 그럼, 당신이 내게 준 코드와 함께 : – kurabdurbos

+0

내 주요 방법 : var sortExpression = testing.GetExpression ("EFFECTIVE_DATE", "EFFECTIVE_DATE"); \t \t 경우 (e.SortDirection == SortDirection.Ascending) { \t paymentAuthorizationList.Sort (sortExpression); } – kurabdurbos

+0

편집 한 버전에서 어떤 문제가 있습니까? 좋은데. – usr

답변

4

글쎄, 당신은 "정적"람다 표현식을 사용하여 컴파일러의 도움으로 그것을 만들 수 있습니다

var paramX = Expression.Parameter(typeof(Foo), "x"); // x 
var paramY = Expression.Parameter(typeof(Foo), "y"); // y 

var xDate = Expression.Property(paramX, "EFFECTIVE_DATE"); // x.EFFECTIVE_DATE 
var yDate = Expression.Property(paramY, "EFFECTIVE_DATE"); // y.EFFECTIVE_DATE 

// DateTime.Compare(y.EFFECTIVE_DATE, x.EFFECTIVE_DATE) 
var body = Expression.Call(typeof(DateTime).GetMethod("Compare"), yDate, xDate); 

// (x, y) => DateTime.Compare(y.EFFECTIVE_DATE, x.EFFECTIVE_DATE) 
var expr = Expression.Lambda<Func<Foo, Foo, int>>(body, paramX, paramY); 
+0

빠른 응답을 보내 주셔서 감사합니다. 이것은 거의 나를 거기에서 붙잡는 것처럼 보인다 - 그러나 더 약간의 장애에 빠져 들어갔다. 나는 곧 이것을 덧붙일 것이다. 다른 질문을하기 전에 한 가지 더 시도해보십시오. – kurabdurbos