我创建了一个通用的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;
的实例调用
我不明白错误的细节 你能解释一下吗? 谢谢
答案 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);
}