2013-06-02 5 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

ああ、それはかなり控えめです。たぶんそれは最高の解決策ですが、私は反射やサードパーティの拡張を伴わない簡単なソリューションがあることを願っていました... –

+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(); 

次に、あなたの構文は、最初の1のオフ秒Funcを構築するための罰金となります。もちろん、これはメモリ内オブジェクト(Linqからオブジェクトまで)でのみ機能します。

Expressionをビルドするには、評価ツリーを明示的に作成する必要があります(Expressionのさまざまな静的メソッドを使用)。この毛先のために、LINQKitを含むいくつかのヘルパーパッケージがあります。

+0

ええ、私は式が必要です。 SQL側でクエリを実行したい。 –

+0

それから、Aniの解決策に行く! –

関連する問題