Linq 如何在泛型lambda表达式中应用string.contains方法

Linq 如何在泛型lambda表达式中应用string.contains方法,linq,lambda,expression,expression-trees,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.Para


我创建了一个通用的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);
    }
public Expression GenericExpression(string propertyName,string searchTerm)
{
//x=>x.Name.Contains(“Emre”);
var参数=表达式参数(typeof(TSource),“x”);
var property=Expression.property(参数,propertyName);
var search=Expression.Constant(searchTerm,typeof(string));
MethodInfo method=typeof(string).GetMethod(“Contains”,new[]{typeof(string)});
var containsMethodExp=Expression.Call(属性、方法、搜索);
返回表达式.Lambda(containsMethodExp,参数);
}
调用GenericExpression函数时出错。 错误消息显示:

无法使用类型为“System.Int32”的实例调用在类型为“System.String”上声明的方法“Boolean Contains(System.String)”

我不了解错误详细信息。
你能解释一下吗 谢谢

错误已修复。 在通过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);
    }
publicIQueryable搜索(DbSet DbSet,stringsearchTerm,igridItemGridItemType),其中T:class
{
var query=new SearchQuery().query;
query=dbSet;
var gridItemFields=gridItemType.GetType().GetProperties();
foreach(gridItemFields中的变量字段)
{
if(field.PropertyType==typeof(字符串))
{
字符串_nameProperty=typeof(T).GetProperty(field.Name).Name;
var lambda=GenericExpression(_nameProperty,searchTerm);
query=query.Where(λ);
}
}
返回查询;
}
公共表达式GenericeExpression(string propertyName、string searchTerm)
{
//x=>x.Name.Contains(“Emre”);
ParameterExpression参数=Expression.parameter(typeof(TSource),“x”);
Expression property=Expression.property(参数,propertyName);
var search=Expression.Constant(searchTerm,typeof(string));
MethodInfo method=typeof(string).GetMethod(“Contains”,new[]{typeof(string)});
var containsMethodExp=Expression.Call(属性、方法、搜索);
返回表达式.Lambda(containsMethodExp,参数);
}

看起来您正试图在数字列上应用该筛选表达式。hımm是的。我在“foreach循环”中应用这个函数,第一个参数类型是数值。其他的是字符串。在这种情况下,无法将数字类型转换为字符串。谢谢,所以我需要先应用ToString方法。我已经试用了你的代码,效果很好。你如何使用它,我认为这是一个问题。看起来您将其应用于int属性,而不是字符串。嗨,Maksim。现在,我通过PropertyInfo.PropertyType在调用方法之前检查参数类型。现在很好用。