フィルタリング可能なBindingList from this sourceを作成しました。それは素晴らしいです:LikeのようにSystem.Linq.Expressions.Expressionを作成する方法?
list.Filter("Customer == 'Name'");
何をすべきですか?内部はパーサのように動作し、式==
または!=
をSystem.Linq.Expressions.Expression
に変換します。この場合、==
はSystem.Linq.Expressions.Expression.Equal
となります。
残念ながらSystem.Linq.Expressions.Expression
には類似の演算子が含まれていません。これを解決する方法はわかりません。
初期のコードは次のようになります。
private static Dictionary<String, Func<Expression, Expression, Expression>>
binaryOpFactory = new Dictionary<String, Func<Expression, Expression, Expression>>();
static Init() {
binaryOpFactory.Add("==", Expression.Equal);
binaryOpFactory.Add(">", Expression.GreaterThan);
binaryOpFactory.Add("<", Expression.LessThan);
binaryOpFactory.Add(">=", Expression.GreaterThanOrEqual);
binaryOpFactory.Add("<=", Expression.LessThanOrEqual);
binaryOpFactory.Add("!=", Expression.NotEqual);
binaryOpFactory.Add("&&", Expression.And);
binaryOpFactory.Add("||", Expression.Or);
}
その後、私は私がやりたいだろう式を作成しました:
private static System.Linq.Expressions.Expression<Func<String, String, bool>>
Like_Lambda = (item, search) => item.ToLower().Contains(search.ToLower());
private static Func<String, String, bool> Like = Like_Lambda.Compile();
例えば
Console.WriteLine(like("McDonalds", "donAld")); // true
Console.WriteLine(like("McDonalds", "King")); // false
しかしbinaryOpFactory
がこれを必要とします。
System.Linq.Expressions.Expression.Or;
誰がどのように私の表現に変換するために教えてもらえます:
Func<Expression, Expression, Expression>
事前に定義された式は、まさにそのように見えますか?以下のような
そして、どのようにあなたのLIKEが動作しませんか?私はあなたが式を構築するのを手助けすることができますが、私はそれが最初に動作するようにする方法を理解する必要があります...正規表現?含まれますか?等? –
それは問題ではありません。最終的な実装は、正規表現で行うことができます。基本的に私はFuncを持って2つのStringを渡し、returnvalueとしてtrueまたはfalseを取得します。 私の問題は、Func (binaryOpFactoryのジェネリック型のargementsを見てください)のように見えるSystem.Linq.Expressions.Expression Namespaceのオブジェクトの実装を理解できないためです私自身の比較。 –
Re comment:Expression APIを理解することができます。私はブログでいくつかの基本をカバーしようとしています。 Jonの本(C#in Depth)もまた高いレベルの概要を提供します。 –