ユーザー (通常はパワー ユーザー) がブール式を入力できるアプリが必要です。.NET と SQL の両方でブール式を実行できるようにしたいと考えています。
式自体はそれほど難しいものではなく、次のようなものです。
- 国はアメリカ合衆国です
- 国は次のいずれかです: 米国、カナダ、メキシコ
- (国は米国) AND (年齢は 20 歳)
- (country is United States) OR ((age is 20) and country is one of: United States, canada)
「in」、equals、greater/less than、between、contains、startswith などの基本的なものをサポートできる必要があります。C# にコンパイルして、type のオブジェクトに対して実行できるようにしたいと考えていますdynamic
。式を SQL にコンパイルできます。結果を非常に具体的なクエリの where 句に挿入します。
Nhibernate や EntityFramework を使用したくありません。SQL を直接実行できるようにしたいのです。
更新: ADO.NET を使用して実行したいことは既にわかっています。はっきり言わなかったらごめんなさい。C# と SQL の両方で実行できるブール式を格納するための適切な方法を知りたいだけです。ストアド プロシージャとパラメーター化は気にしません (クエリを生成できるようになれば、後者は明白で些細なことです)。式を入力するユーザーは社内のユーザーで、ほとんどが開発者とパワー ユーザーです。
だから私はこれを達成するために、式ツリー、抽象構文ツリー、LINQ などを使用する方向に沿って考えています。私は ORM を使用したくありませんが、ORM が LINQ 式でラムバをWHERE
句のコードに変換するのと非常によく似た処理を実行したいと考えています。
更新 2:
これまでに考えている方法は、式を C# として入力し、データベースに文字列として格納することです。.NET コンテキストで実行する場合は、ラムダまたは式にコンパイルし、ブール式を表すメソッドとのインターフェイスとしてオブジェクトにラップしますinterface IDynamicFilter { bool PassesFilter<SomePocoType>(poco); }
。または、POCO を IEnumerable にドロップし、渡されたラムダ/式で LINQ .Where() を実行して、フィルターに一致するオブジェクトを引き出すことができます。
SQL の場合、これは私がより曖昧にしている部分です。ORM が行うことを複製したいと考えています。つまり、Expression ツリーにアクセスして、それを SQL 文字列にレンダリングします。SQL の完全なセットをサポートする必要はありません。括弧によるグループ化、AND/OR/NOT、in/not in、GT/LT/EQ/NEQ/between などの非常に単純な演算子のみをサポートする必要があります。また、いくつかの基本的な数学演算もサポートしたいと考えています ( a + b > c
)。