如何在泛型lambda表达式

时间:2017-01-06 21:19:13

标签: linq lambda expression expression-trees


我创建了一个通用的lambda表达式函数,如下所示 我尝试创建一个动态过滤查询。

public Expression<Func<TSource, bool>> GenericExpression<TSource>(string propertyName, string searchTerm)
    {
        //x=>x.Name.Contains("Emre");
        var parameter = Expression.Parameter(typeof(TSource), "x");
        var property = Expression.Property(parameter,propertyName);
        var search = Expression.Constant(searchTerm,typeof(string));
        MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
        var containsMethodExp = Expression.Call(property, method, search);

        return Expression.Lambda<Func<TSource, bool>>(containsMethodExp, parameter);
    }

调用GenericExpression函数时出错。 错误消息显示:

  

方法&#39;布尔包含(System.String)&#39;声明类型&#39; System.String&#39;不能使用类型&System; System.Int32&#39;

的实例调用

我不明白错误的细节 你能解释一下吗? 谢谢

1 个答案:

答案 0 :(得分:0)

错误已修复。 我们应该在通过PropertyInfo.PropertyType调用方法之前检查参数类型。它现在有效。

public IQueryable<T> Search<T>(DbSet<T> dbSet, string searchTerm, IGridItem gridItemType) where T : class
    {
        var query = new SearchQuery<T>().Query;
        query = dbSet;
        var gridItemFields = gridItemType.GetType().GetProperties();

        foreach (var field in gridItemFields)
        {
            if (field.PropertyType == typeof(String))
            {
                string _nameProperty = typeof(T).GetProperty(field.Name).Name;
                var lambda = GenericExpression<T>(_nameProperty, searchTerm);
                query = query.Where(lambda);
            }
        }

        return query;
    }

public Expression<Func<TSource, bool>> GenericExpression<TSource>(string propertyName, string searchTerm)
    {
        //x=>x.Name.Contains("Emre");
        ParameterExpression parameter = Expression.Parameter(typeof(TSource), "x");
        Expression property = Expression.Property(parameter,propertyName);
        var search = Expression.Constant(searchTerm,typeof(string));

        MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
        var containsMethodExp = Expression.Call(property, method, search);

        return Expression.Lambda<Func<TSource, bool>>(containsMethodExp, parameter);
    }