私はすべてのことを説明する時間がありませんが、一般的な要点は、Expression
クラスの静的メソッドを使用して式を構築することです。
たとえば、new
表現は、コンストラクタ情報と一連の式などをオーバーロードの1つに渡すことによって作成されます。
r => ...
のコンセプトは、をラムダのパラメータとして渡すExpression.Lambda<Func<T, TKey>>(...)
によって具体化されています。
Expression.MakeMemberAccess
は、r.EmployeeId
とr.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 @
:いいえ、「動的」私は彼が、彼はコードがコンパイル時に社員と名前を指定したくないことを意味かなり確信していることもできます。彼は実行時に知られている情報を代わりに使用したいと考えています。 – StriplingWarrior
ありがとうございますが、 'Expression>を' Expressions'を使って作成したいと思います。 –
Arian
@ StriplingWarriorを参照しているリンクを参照してくださいはいいいえ – Arian