文字列式を LINQ 式ツリーに解析する
文字列として表現された論理条件をオブジェクト インスタンスに対して評価するには、体系的なアプローチが必要です。 ANTLR を使用してカスタム文法と AST を実装することは実行可能なオプションですが、非常に複雑なソリューションになる可能性があります。
ダイナミック LINQ ライブラリ
ダイナミック LINQ ライブラリは、文字列式を式ツリーに動的に解析する便利な方法を提供します。これは、ラムダ式を受け取り、条件の評価に使用できるコンパイルされた式を返す DynamicExpression.ParseLambda というメソッドを提供します。
var p = Expression.Parameter(typeof(Person), "Person"); var e = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p }, null, exp);
Expression Tree Assembly
Expression クラスを使用して、式ツリーを手動で組み立てることもできます。このアプローチでは、LINQ 式ツリー構造をより深く理解する必要がありますが、式作成プロセスをより詳細に制御できます。
var ageExpr = Expression.GreaterThan(Expression.Property(p, "Age"), Expression.Constant(3)); var weightExpr = Expression.GreaterThan(Expression.Property(p, "Weight"), Expression.Constant(50)); var andExpr = Expression.AndAlso(ageExpr, weightExpr); var ageLessThanExpr = Expression.LessThan(Expression.Property(p, "Age"), Expression.Constant(3)); var orExpr = Expression.OrElse(andExpr, ageLessThanExpr);
単純な文字列評価
If式文字列は比較的単純なので、リフレクションと文字列解析を組み合わせて評価できます。このアプローチは柔軟性に劣りますが、次の限られたシナリオに適しています。
var filter = "(Person.Age > 3) AND (Person.Weight > 50) OR (Person.Age < 3)"; var result = bob.GetType().GetProperty("Age").GetValue(bob) > 3 && bob.GetType().GetProperty("Weight").GetValue(bob) > 50 || bob.GetType().GetProperty("Age").GetValue(bob) < 3;
最適なアプローチは、式の複雑さと、解析に必要な柔軟性のレベルによって異なります。単純なシナリオの場合は、単純な文字列評価またはリフレクションベースのメソッドで十分な場合があります。ただし、より複雑な式や動的解析の要件については、動的 LINQ ライブラリを利用するか、式ツリーを手動で組み立てることを検討してください。
以上が文字列式を効率的に解析して LINQ 式ツリーにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。