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
Post a Comment