2017-09-19 5 views
0

式の作成:Create a Lambda Expression With 3 conditionsは<のFunc <T, TKey>>に関連した動的

をこのGroupBy文を考えてみてください:

group r by new { r.EmployeeID, r.Name } 

私はLambdaバージョンでGroupBy書上の書き込み、パラメータとしてそれをExpression<Func<T, TKey>>を渡したい場合は、どうすればExpression<Func<T, TKey>>を作成できますか?

+1

:いいえ、「動的」私は彼が、彼はコードがコンパイル時に社員と名前を指定したくないことを意味かなり確信していることもできます。彼は実行時に知られている情報を代わりに使用したいと考えています。 – StriplingWarrior

+0

ありがとうございますが、 'Expression >を' Expressions'を使って作成したいと思います。 – Arian

+0

@ StriplingWarriorを参照しているリンクを参照してくださいはいいいえ – Arian

答えて

1

私はすべてのことを説明する時間がありませんが、一般的な要点は、Expressionクラスの静的メソッドを使用して式を構築することです。

たとえば、new表現は、コンストラクタ情報と一連の式などをオーバーロードの1つに渡すことによって作成されます。

r => ...のコンセプトは、をラムダのパラメータとして渡すExpression.Lambda<Func<T, TKey>>(...)によって具体化されています。

Expression.MakeMemberAccessは、r.EmployeeIdr.Nameの生産に役立ちます。

私はそれが役に立つようなコードでLINQPadのサンプル式をダンプすることで開始することを見つける

:あなたはツリーを検査し、ツリーを構成する式の種類を理解することができるようになります

void Main() 
{ 
    DumpExp(r => new { r.EmployeeID, r.Name }); 
} 

public void DumpExp<TKey>(Expression<Func<Foo, TKey>> expr) 
{ 
    expr.Dump(); 
} 

public class Foo 
{ 
    public string EmployeeID; 
    public string Name; 
} 

、そしてどのようなそのプロパティの値は次のとおりです。次に、一致するコードを書くことができます。あなたが動作すると思わ式を持ったら

、あなたは、メモリ内のオブジェクトにその動作をテストするために使用できる実行可能な機能を、製造することでコンパイルを呼び出すことができます。

私はあなたが問題の最も難しい部分があるかもしれないんだ匿名型を推測しています。ターゲットフレームワークがGroupByステートメントでタプルのようなものをサポートしている場合は、それらを代わりに使うほうが良いでしょう。

LINQのようなメソッドに文字列を提供することにより、構築された動的なLINQステートメントを実行することができますように設計されたやや古いプロジェクトがあります。それは "ダイナミックLINQ"と呼ばれ、あなたのニーズに合うかもしれません。

またthis library役に立つかもしれません。より流暢な構文で表現木を構築するのに役立つはずです。しかし、それは積極的な開発の下にあるようには見えない。 shA.t @

+0

偉大な答え...このトピックに関するいくつかのドキュメントがあります。可能であれば、私はあなたに上記のステートメントをここに書いて欲しいと思います。私はこのように表現を使用しなかったし、実際のサンプルを見ることができればそれは正しく検索するのに非常に役立つでしょう。 – Arian

+0

@Arian:私はこれを書く時間がありませんが、[this post](https: //スタックオーバーフロー。あなたはあなたのケースに適応できるはずのよい一般的な例のために、/ com/questions/5225416/convert-linq-sql-expression-to-expression-tree) – StriplingWarrior

関連する問題