c# - How to remove or overwrite where clause in existing IQueryable -
assuming following prefiltered iqueryable:
var query = items.where(i => i.propertyname == "some property");
coming third party library, possible either remove clause completely, or replace with:
.where(i => i.propertyname == null || i.propertyname == "some property")
i've seen mentions of being able rewrite iqueryable on fly. approach have downsides? how go doing it? there better way?
update
i've managed cobble using expressionvisitor suggested ivan:
public class whereremovevisitor : expressionvisitor { protected override expression visitmethodcall(methodcallexpression node) { if (node.method.name == "where" && node.method.declaringtype == typeof(queryable)) return node.arguments[0]; else return base.visitmethodcall(node); } }
and:
public static class iqueryableextensions { public static iqueryable<t> removewhere<t>(this iqueryable<t> expression) { return expression.lambda<iqueryable<t>>(new whereremovevisitor().visit(expression.expression)).compile(); } }
while compiles fine, throws "lambda type parameter must derived system.delegate" in extension method.
i've managed put using expressionvisitor suggested ivan:
public class whereremovevisitor : expressionvisitor { protected override expression visitmethodcall(methodcallexpression node) { if (node.method.name == "where" && node.method.declaringtype == typeof(queryable)) return node.arguments[0]; else return base.visitmethodcall(node); } }
and:
public static class iqueryableextensions { public static iqueryable<t> removewhere<t>(this iqueryable<t> expression) { var delexpr = expression.lambda<func<iqueryable<t>>>(new whereremovevisitor().visit(expression.expression)).compile(); return delexpr(); } }
Comments
Post a Comment