Regex.IsMatch()
を呼び出して、動的linqクエリ内で返された結果を評価しようとしています。これは私が試したものです:
public static LambdaExpression Parse(SearchQuery query)
{
string compilableExpression = "Regex.IsMatch(Category.ToLower(), \"\\bSomeCat\\b\", RegexOptions.Compiled) == true";
ParameterExpression parameter1 = System.Linq.Expressions.Expression.Parameter(typeof(EventListItem));
ParameterExpression parameter2 = System.Linq.Expressions.Expression.Parameter(typeof(Regex));
return System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { parameter1, parameter2 }, null, compilableExpression);
}
この場合、 Category
はEventListItem
プロパティです。この例外は、 ParseLambda()
を呼び出すとスローされます。
Unknown identifier 'Regex'
。
メソッドを呼び出す方法はありますか? Expression.Call()
メソッドを見つけましたが、それが私が探しているものかどうかはわかりません。どんな助けでもありがたいです。
私はSystem.Linq.Dynamic
をあまり使用していませんが、サンプルを機能させる方法を次に示します。
1-実際には1つの入力オブジェクト、 EventListItem
しかないので、parameter2(Regex)を削除します。
string compilableExpression = "Regex.IsMatch(Category.ToLower(), \"\\bSomeCat\\b\", RegexOptions.Compiled) == true";
ParameterExpression parameter1 = System.Linq.Expressions.Expression.Parameter(typeof(EventListItem));
return System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { parameter1 }, null, compilableExpression);
2- DynamicExpression.ParseLambda()
は、 入力オブジェクトからプロパティとメソッドを読み取るために作成されます 。他のクラスでのメソッドの使用(ここでは、 Regex.IsMatch()
は事前定義されたクラスの小さなセットに制限されており、デフォルトではRegex
はそれらの1つではありません)。
したがって、「正規表現」はクラスであり、EventListItemのプロパティではないことをパーサーに認識させる必要があります。プロジェクトにDynamicLinq.csファイルが含まれていると仮定すると、これは、Regex(およびRegexOptions)を内部のExpressionParser.predefinedTypes
配列に追加することで実行できます。
static readonly Type[] predefinedTypes = {
typeof(Object),
typeof(Boolean),
...
typeof(System.Text.RegularExpressions.Regex),
typeof(System.Text.RegularExpressions.RegexOptions),
};
編集:複雑なパラメーター値
メソッドの呼び出しにより複雑なパラメーターを含める必要がある場合は、RegexOptions列挙型を組み合わせます。 RegexOptions.Compiled | RegexOptions.IgnoreCase
、ParseLambdaはvalues
リストも受け入れvalues
。
結合された列挙型を事前に準備し、その値リストに送信します。 compilableExpression
は、サブミットする値のプレースホルダーを含め、サブミットするのと同じ順序でインデックスを付けます(ここでは、値は1つだけです-インデックス0)
var options = RegexOptions.Compiled | RegexOptions.IgnoreCase;
string compilableExpression = "Regex.IsMatch(Category.ToLower(), \"\\bSomeCat\\b\", @0) == true";
ParameterExpression parameter1 = SLE.Expression.Parameter(typeof(EventListItem));
return SLD.DynamicExpression.ParseLambda(new[] { parameter1 },
null,
compilableExpression,
options);
おまけ:RegexOptionsクラス/列挙がcompilableExpressionで直接参照されなくなったため、ExpressionParser.predefinedTypesにRegexOptionsを含める必要もなくなりました。