How would I go about using an Expression Tree to dynamically create a predicate that looks something like...
(p.Length== 5) && (p.SomeOtherProperty == "hello")
So that I can stick the predicate into a lambda expression like so...
q.Where(myDynamicExpression)...
I just need to be pointed in the right direction.
Update: Sorry folks, I left out the fact that I want the predicate to have multiple conditions as above. Sorry for the confusion.
Expression trees represent code in a tree-like data structure, where each node is an expression, for example, a method call or a binary operation such as x < y . You can compile and run code represented by expression trees.
Original
Like so:
var param = Expression.Parameter(typeof(string), "p"); var len = Expression.PropertyOrField(param, "Length"); var body = Expression.Equal( len, Expression.Constant(5)); var lambda = Expression.Lambda<Func<string, bool>>( body, param);
Updated
re (p.Length== 5) && (p.SomeOtherProperty == "hello")
:
var param = Expression.Parameter(typeof(SomeType), "p"); var body = Expression.AndAlso( Expression.Equal( Expression.PropertyOrField(param, "Length"), Expression.Constant(5) ), Expression.Equal( Expression.PropertyOrField(param, "SomeOtherProperty"), Expression.Constant("hello") )); var lambda = Expression.Lambda<Func<SomeType, bool>>(body, param);
Use the predicate builder.
http://www.albahari.com/nutshell/predicatebuilder.aspx
Its pretty easy!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With