ホームページ >バックエンド開発 >C++ >文字列式を効率的に解析して LINQ 式ツリーにするにはどうすればよいですか?

文字列式を効率的に解析して LINQ 式ツリーにするにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-06 18:42:40207ブラウズ

How Can I Efficiently Parse String Expressions into LINQ Expression Trees?

文字列式を 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。