2013-06-02 1 views
6

나는 다음과 같은 형태의 코드 조각을 발견 :Expression을 다른 메서드로 반환하는 메서드를 나타내는 구문은 무엇입니까?

public static Expression<Func<Invoice, CustomerContact>> GetCustomerContact() 
{ 
    return i => new CustomerContact { 
       FirstName = i.Customer.FirstName, 
       LastName = i.Customer.LastName, 
       Email = i.Customer.Email, 
       TelMobile = i.Customer.TelMobile, 
       }; 
} 

코드의 다른 부분에서를, 나는 송장에서뿐만 아니라, 같은 경량 CustomerContact 개체를 얻을 싶어하지만 고객 자체에서. 할 수있는 분명한 것은이하는 것입니다 그래서 : 다음

public static Expression<Func<Customer, CustomerContact>> GetCustomerContact() 
{ 
    return c => new CustomerContact { 
       FirstName = c.FirstName, 
       LastName = c.LastName, 
       Email = c.Email, 
       TelMobile = c.TelMobile, 
       }; 
} 

을하고 Expression이 방법, 즉 참조 입력으로 Invoice을 복용 변경이 같은 :

public static Expression<Func<Invoice, CustomerContact>> GetCustomerContact() 
{ 
    return i => GetCustomerContact(i.Customer); // doesn't compile 
} 

에 대한 올바른 구문 무엇 이?

+2

오류를 게시하면 도움이됩니다. –

+0

@newStackExchangeInstance : "메서드, 대리자 또는 이벤트가 필요합니다." –

답변

3

당신은 Expression.Invoke를 사용할 수 있습니다

var paramExpr = Expression.Parameter(typeof(Invoice), "i"); 
var propertyEx = Expression.Property(paramExpr, "Customer"); 

var body = Expression.Invoke(GetCustomerContactFromCustomer(), propertyEx); 

return Expression.Lambda<Func<Invoice, CustomerContact>>(body, paramExpr); 

일부 LINQ 공급자는 호출-표현에 문제가 있습니다 마십시오.

var expr = GetCustomerContactFromCustomer(); 
Expression<Func<Invoice, CustomerContact>> result = i => expr.Invoke(i.Customer);  
return result.Expand(); 
+0

아쉽습니다. 어쩌면 그게 최선의 해결책이지만, 반사 또는 제 3 자 확장을 포함하지 않는 간단한 해결책이 있기를 바랐다. ... –

+0

이 방식으로 Expression.Invoke보다 표현 방법이 더 쉽다고 생각하지 않는다. 방법. LINQKIt 방식은 아주 간단하고 우아하며 언어 람다를 사용할 수있는 역량을 제공합니다. – Ani

+0

LinqKit은 다른 분야의 프로젝트에서 유용 할 것입니다. 감사합니다. 그리고 답 신용을! :-) –

0

당신이 확실 당신이 Expression를 사용해야합니다 :

가장 쉬운 방법이 문제를 해결하기 위해 (당신에게 더 편리한 구문을 제공하기 위해이) LINQKit를 사용하는 것입니다? 다른 Linq 공급자가 코드 트리를 쿼리로 변환 할 필요가 없다면 대신 Func 만 사용하는 것이 좋습니다. 당신이 너무 Func를 사용하는 경우 메소드 서명이 있음 :

public static Func<Customer, CustomerContact> GetCustomerContact(); 

public static Func<Customer, CustomerContact> GetCustomerContact(); 

이 그런 다음 구문은 첫 번째 오프 두 번째 Func를 구성하는 괜찮을 것입니다. 물론 이것은 메모리 내 객체 (Linq에서 객체까지)에서만 작동합니다.

Expression을 빌드하기 위해서는 명백히 평가 트리를 작성해야합니다. Expression에 다양한 정적 메소드를 사용하여 매우 털이있을 수 있습니다. 이 털이 있기 때문에 LINQKit을 비롯한 몇 가지 도우미 패키지가 있습니다.

+0

그래, 나는 표정이 필요해. 쿼리가 SQL 측에서 실행되기를 원합니다. –

+0

그러면 Ani의 해결책을 찾으십시오! –