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

Popular posts from this blog

blackberry 10 - how to add multiple markers on the google map just by url? -

php - guestbook returning database data to flash -

delphi - Dynamic file type icon -