How to create an expression tree to do the same thing as "StartsWith"

I currently have this method for comparing two numbers

Private Function ETForGreaterThan(ByVal query As IQueryable(Of T), ByVal propertyValue As Object, ByVal propertyInfo As PropertyInfo) As IQueryable(Of T) Dim e As ParameterExpression = Expression.Parameter(GetType(T), "e") Dim m As MemberExpression = Expression.MakeMemberAccess(e, propertyInfo) Dim c As ConstantExpression = Expression.Constant(propertyValue, propertyValue.GetType()) Dim b As BinaryExpression = Expression.GreaterThan(m, c) Dim lambda As Expression(Of Func(Of T, Boolean)) = Expression.Lambda(Of Func(Of T, Boolean))(b, e) Return query.Where(lambda) End Function 

It works great and is consumed this way.

 query = ETForGreaterThan(query, Value, propertyInfo) 

As you can see, I give it the IQueryable collection and add the where clause to it based on the property and value. Y can build Lessthan, LessOrEqualThan, etc. Equivalents like System.Linq.Expressions.Expression have these operators predefined.

ยฟHow can I convert this code to do the same with strings? System.Linq.Expressions.Expression does not give me a predefined operator like "contains" or "startwith", and I am really noob with expression trees.

Thanks, and please write your answer in C # / VB. Choose the one that makes you feel more comfortable.

+7
source share
2 answers
 using System; using System.Linq; using System.Linq.Expressions; using System.Reflection; namespace WindowsFormsApplication1 { static class Program { [STAThread] static void Main() { using (var context = new NorthwindEntities()) { PropertyInfo propertyInfo = typeof(Customer).GetProperty("CustomerID"); IQueryable<Customer> query = context.Customers; query = ETForStartsWith<Customer>(query, "A", propertyInfo); var list = query.ToList(); } } static IQueryable<T> ETForStartsWith<T>(IQueryable<T> query, string propertyValue, PropertyInfo propertyInfo) { ParameterExpression e = Expression.Parameter(typeof(T), "e"); MemberExpression m = Expression.MakeMemberAccess(e, propertyInfo); ConstantExpression c = Expression.Constant(propertyValue, typeof(string)); MethodInfo mi = typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) }); Expression call = Expression.Call(m, mi, c); Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(call, e); return query.Where(lambda); } } } 
+17
source

This is not a statement, but a method, so you can call it with Expression.Call (), where the methodinfo parameter will be typeof (string) .GetMethod ("StartsWith").

+4
source

All Articles