Like an operator in an expression tree

I have a Linq extension method for dynamically filtering Linq queries using string values. For example: query.WhereHelper("columName", ">", 1) . I could use many different filter operators, such as GreaterThan or NotEqual etc., but not β€œLike”. There is no Expression.Like or Expression.StartsWith expression, etc. How can I implement the Like operator in my expression tree? Here is my code:

 public static IQueryable<T> WhereHelper<T>(this IQueryable<T> source, string columnName, object value, string filterType) { ParameterExpression table = Expression.Parameter(typeof(T), ""); Expression column = Expression.PropertyOrField(table, columnName); Expression valueExpression = Expression.Convert(Expression.Constant(value), column.Type); Expression where = null; switch (filterType) { case "<": where = Expression.LessThan(column, valueExpression); break; case "<=": where = Expression.LessThanOrEqual(column, valueExpression); break; case "=": where = Expression.Equal(column, valueExpression); break; case ">": where = Expression.GreaterThan(column, valueExpression; break; case ">=": where = Expression.GreaterThanOrEqual(column, valueExpression); break; case "<>": where = Expression.NotEqual(column, valueExpression); break; } Expression lambda = Expression.Lambda(where, new ParameterExpression[] { table }); Type[] exprArgTypes = { source.ElementType }; MethodCallExpression methodCall = Expression.Call(typeof(Queryable), "Where", exprArgTypes, source.Expression, lambda); return (IQueryable<T>)source.Provider.CreateQuery<T>(methodCall); 
+6
lambda linq entity-framework expression-trees
source share
2 answers

You would use Expression.Call with the methods string.StartsWith , string.Contains , string.EndsWith , etc. This is so that the consumption code translates it back to TSQL. Note that for LINQ-to-SQL there are also additional helper functions here, but not with EF.

+7
source share

You can define a LIKE expression as follows:

 var propertyName = "Firstname"; var propertyValue= "xxxx"; MethodInfo refmethod = typeof(string).GetMethod("Contains", new[] { typeof(string) }); var parameter = Expression.Parameter(typeof(T), "type"); var property = Expression.Property(parameter, propertyName); var value = Expression.Constant(propertyValue, typeof(string)); var containsMethodExp = Expression.Call(property, refmethod, value); 
+6
source share

All Articles