c# - Invoking Regex.IsMatch() inside a dynamic linq query -
i'm trying invoke regex.ismatch()
, evaluate returned result inside dynamic linq query. tried:
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); }
in case category
property in eventlistitem
. exception thrown upon calling parselambda()
:
unknown identifier 'regex'
.
is there way invoke method? came across expression.call()
method, i'm not sure if that's i'm looking for. appreciated.
i haven't used system.linq.dynamic
lot, here way make example work:
1 - have 1 input object, eventlistitem
, remove 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()
made read properties , methods input object. using methods on other classes (here: regex.ismatch()
limited small set of predefined classes, , default regex
isn't 1 of them.
therefore, somehow need make parser realize "regex" class , not property on eventlistitem. assuming have included dynamiclinq.cs file in project, can done adding regex (and regexoptions) internal expressionparser.predefinedtypes
array:
static readonly type[] predefinedtypes = { typeof(object), typeof(boolean), ... typeof(system.text.regularexpressions.regex), typeof(system.text.regularexpressions.regexoptions), };
edit: complex parameter values
if need include more complex parameters in our method calls, e.g. combined regexoptions enum; regexoptions.compiled | regexoptions.ignorecase
, parselambda accepts list of values
.
we prepare combined enum beforehand, , submit in values list. in compilableexpression
include placeholders values submit, indexed in same order submit them (here have 1 value - index 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);
bonus: because regexoptions class/enum no longer directly referenced in compilableexpression, no longer need include regexoptions in expressionparser.predefinedtypes.
Comments
Post a Comment