LINQ Expression> equavalent of .Contains()

前端 未结 2 1975
别那么骄傲
别那么骄傲 2021-02-14 23:32

Has anybody got an idea of how to create a .Contains(string) function using Linq Expressions, or even create a predicate to accomplish this

public static Express         


        
相关标签:
2条回答
  • 2021-02-15 00:25
    public static Expression<Func<string, bool>> StringContains(string subString)
    {
        MethodInfo contains = typeof(string).GetMethod("Contains");
        ParameterExpression param = Expression.Parameter(typeof(string), "s");
        var call = Expression.Call(param, contains, Expression.Constant(subString, typeof(string)));
        return Expression.Lambda<Func<string, bool>>(call, param);
    }
    
    ...
    
    // s => s.Contains("hello")
    Expression<Func<string, bool>> predicate = StringContains("hello");
    

    Looking at this many years later, I suddenly realize there's a much simpler approach for this specific example:

    Expression<Func<string, bool>> predicate = s => s.Contains("hello");
    
    0 讨论(0)
  • 2021-02-15 00:28

    I use something similiar, where I add filters to a query.

    public static Expression<Func<TypeOfParent, bool>> PropertyStartsWith<TypeOfParent, TypeOfPropery>(PropertyInfo property, TypeOfPropery value)
    {
         var parent = Expression.Parameter(typeof(TypeOfParent));
         MethodInfo method = typeof(string).GetMethod("StartsWith",new Type[] { typeof(TypeOfPropery) });
         var expressionBody = Expression.Call(Expression.Property(parent, property), method, Expression.Constant(value));
         return Expression.Lambda<Func<TypeOfParent, bool>>(expressionBody, parent);
    }
    

    Usage, to apply filter against a property whose name matches Key, and using supplied value, Value.

    public static IQueryable<T> ApplyParameters<T>(this IQueryable<T> query, List<GridParameter> gridParameters)
    {
    
       // Foreach Parameter in List
       // If Filter Operation is StartsWith
        var propertyInfo = typeof(T).GetProperty(parameter.Key);
        query = query.Where(PropertyStartsWith<T, string>(propertyInfo, parameter.Value));
    }
    

    And yes, this method works with contains:

            public static Expression<Func<TypeOfParent, bool>> PropertyContains<TypeOfParent, TypeOfPropery>(PropertyInfo property, TypeOfPropery value)
        {
            var parent = Expression.Parameter(typeof(TypeOfParent));
            MethodInfo method = typeof(string).GetMethod("Contains", new Type[] { typeof(TypeOfPropery) });
            var expressionBody = Expression.Call(Expression.Property(parent, property), method, Expression.Constant(value));
            return Expression.Lambda<Func<TypeOfParent, bool>>(expressionBody, parent);
        }
    

    By having those 2 examples, you can more easily understand how we can call various different methods by name.

    0 讨论(0)
提交回复
热议问题