動的 LINQ 式と動的ラムダ式?
質問
LINQ クエリとラムダ式を動的に記述する最良の方法は何ですか?
エンドユーザーがビジネス ロジック ルールを設計でき、それを実行する必要があるアプリケーションを考えています。
初歩的な質問で申し訳ありませんが、経験からベストプラクティスを教えていただければ幸いです。
解決
Bart De Smet の投稿を読むこと以上にお勧めできません (http://community.bartdesmet.net/blogs/bart/)、彼はラムダに関しては本当に優秀です。
彼の最近のシリーズでは、次のような動的 Lambda について取り上げています。 http://community.bartdesmet.net/blogs/bart/archive/2008/08/26/to-bind-or-not-to-bind-dynamic-expression-trees-part-0.aspx
本当に美しいコードです。
他のヒント
もう 1 つの可能性は、スクリプト ランタイムをプログラムに統合して、ユーザーが DSL でビジネス ロジックを記述できるようにすることです。 アイアンパイソン 候補になるだろう。
ラムダを動的に生成する方法は 2 つあります。Reflection.Emit を試して IL (.Net バイトコード) を直接生成し、ラムダとして呼び出すか、System.CodeDom と Microsoft.CSharp.CSharpCodeProvider を使用して高レベルの構造からコードを生成することができます。何をしたいかは、ユーザーにこれをどのように入力してもらいたいかによって異なります。ユーザーに C# を記述してもらいたい場合は、組み込みのコンパイラーを使用するだけです。
Linq を動的に生成するのはもっと簡単になるはずです。実行時に LINQ クエリを式ツリーとして生成し、それを IQueryable に渡して実行できる必要があります。これについて詳しくは、IQueryable のドキュメントを参照することをお勧めします。もう 1 つの方法は、いくつかの linq クエリを事前に定義し、ユーザーがそれらをチェーンできるようにすることです。どの Linq クエリも次の Linq クエリで使用できる IEnumerable を返すため、これは機能するはずです。
ラムダ式は、System.Linq.Expressions 名前空間を介して簡単に作成できます。
System.Linq.Expressions 必要なものです。ユーザーが式ツリーの形式でクエリを動的に定義および構築できる優れた UI を作成しました。その後、これを Linq2SQL または選択したクライアントに渡すことができます。
「最善の方法」と言う意味がわかりません。達成したいことの簡単な例を提供することをお勧めします。動的 LINQ 式の作成は難しいことではありませんが、注意が必要です。
動的 linq 式作成の例を次に示します。