c# - Expression tree condition conversion with selector -


i have entity class like

public class bookpage {     public int pageindex { get; set; } } 

then have expression:

expression<func<int, bool>> pageindexcondition = idx => idx == 1; 

and expression want:

expression<func<bookpage, bool>> pagecondition = bookpage => bookpage.pageindex == 1; 

the question: how use pageindexcondition linq-to-sql query, or how can convert pageindexcondition pagecondition?

edit: solution less elegant, still meet requirement is:

expression<func<t, bool>> getpageindexcondition(expression<func<t, int>> selector) {      return (t item) => selector(item) < 10; // won't work because selector expression, how implement correctly? }  ...  var pagecondition = getpageindexcondition(page => page.pageindex); 

i doing these things, though others have said, there's more efficient , better ways it:

void main() {     expression<func<int, bool>> pageindexcondition = idx => idx == 1;     expression<func<bookpage, bool>> converted = expressionconverter.convert(pageindexcondition); }  public class expressionconverter : expressionvisitor {     public static expression<func<bookpage, bool>> convert(expression<func<int, bool>> e)     {         var oldparameter = e.parameters.first();         var newparameter = expression.parameter(typeof(bookpage), "bp");         expression<func<bookpage, int>> x = (bookpage bp) => bp.pageindex;         var property = ((x.body memberexpression).member propertyinfo);         var memberaccess = expression.property(newparameter, property);          var converter = new expressionconverter(oldparameter, memberaccess);         return (expression<func<bookpage, bool>>)expression.lambda(converter.visit(e.body), newparameter);     }      private parameterexpression pe;     private expression replacement;      public expressionconverter(parameterexpression pe, expression replacement)     {         this.pe = pe;         this.replacement = replacement;     }      protected override expression visitparameter(parameterexpression node)     {         if(node == pe)             return replacement;          return base.visitparameter(node);     }  } 

Comments

Popular posts from this blog

c# - Operator '==' incompatible with operand types 'Guid' and 'Guid' using DynamicExpression.ParseLambda<T, bool> -