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在调用方法之前检查参数类型。现在很好用。