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