文字列「 Employee.Orders.OrderID 」をlinq式で変換したいと思いました:「 employee.Orders.Select(order => order.OrderID) 」。
「Employee.FirstName」などの単純なプロパティでこれを行う方法は既に知っています。私の質問は、コレクション内の型内のプロパティでこれを行う方法です。
「注文」は、「従業員」クラスの注文のコレクションです。 「OrderID」は「Order」クラスのプロパティです。
つまり、これを変換したいのです。
string path = "Employee.Orders.OrderID";
これに;
Expression<Func<Employee, object>> exp = employee => employee.Orders.Select(order => order.OrderID);
これでうまくいくはずです:
https://gist.github.com/4149424
結果の式はコンパイルしていませんが、例外なく式を構築します。
編集:私はラムダを作成してコンパイルするための行を追加しました、それはそれを行うので、機能します。
これは、コレクションOrders.OrderID
プロパティにアクセスするシナリオを処理します。これは、コレクションを一種の複雑にする部分です。これがないと、約30行短くなります。
現在、それは '。'で文字列を分割することです。そして、すべての要素を再帰的に処理します。要素がIEnumerable
(文字列ではない)の場合、追加のSelect
ラムダを作成します。
また、コレクションプロパティのコレクションプロパティにアクセスする、やや複雑な(ただし、同じような)シナリオも処理します。