简体   繁体   中英

Expression to filter data based on a property which is a list of strings

I have the following code:

case FilterQueryType.Contains:
      var parameterExp = Expression.Parameter(type, "type");
      var propertyExp = Expression.Property(parameterExp, filter.PropertyName);
      var containsConstExp = Expression.Constant(filter.MyKeyword);
      MethodInfo method = typeof(string).GetMethod("Contains", new []{typeof(string)});
      var containsMethodExp = Expression.Call(propertyExp, method, containsConstExp);
      var containsLambda = Expression.Lambda<Func<T, bool>>(containsMethodExp, parameterExp);
      items = items.Where(containsLambda);
      break;

This code works fine as long as filter.PropertyName is a string. Now I have a case where filter.PropertyName is actually an enumerable of strings.

Could someone tell me how can I create the correct expression for this? (filter.MyKeyword itself will always be a single value)

 MemberExpression memberExpression = Expression.Property(parameterExp, filter.PropertyName);
 Expression convertExpression = Expression.Convert(memberExpression, typeof(List<string>));
 MethodCallExpression containsExpression = Expression.Call(convertExpression, "Contains", new Type[] { }, constExpr);
 lambda = Expression.Lambda<Func<T, bool>>(containsExpression, parameterExp);
 items = items.Where(lambda);

This solution works for me

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM