LINQ クエリと Lambda 式を動的に記述する最良の方法は何ですか?
私は、エンド ユーザーがビジネス ロジック ルールを設計し、実行する必要があるアプリケーションを考えています。
これが初心者の質問である場合は申し訳ありませんが、経験からベスト プラクティスを得ることができれば幸いです。
バート・デ・シュメット(http://community.bartdesmet.net/blogs/bart/)の投稿を読んでいるよりも高く推薦することはできません。ラムダに関しては、彼は本当に素晴らしい人です。
彼の最近のシリーズは、 http://community.bartdesmet.net/blogs/bart/archive/2008/08/26/to-bind-or-not-to-bind-dynamic-expression-trees-partから始まるダイナミックラムダをカバーしていました-0.aspx
絶対に美しいコード。
もう 1 つの可能性は、スクリプト ランタイムをプログラムに統合して、ユーザーがビジネス ロジックを DSL に記述できるようにすることです。IronPythonが候補になります。
ラムダを動的に生成する方法が 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 式の作成の例を次に示します。