Построение дерева выражений для строки. Содержит [дубликат]
На этот вопрос уже есть ответ здесь:
Как создать дерево выражений для представления «String.Contains (« term »)» в C #? 4 ответаЯ изо всех сил пытаюсь построить дерево выражений, чтобы я мог динамически выполнять фильтрацию некоторых данных.
Я придумал это, но это не удается наvar lambda =
линия
foreach (var rule in request.Where.Rules)
{
var parameterExpression = Expression.Parameter(typeof(string), rule.Field);
var left = Expression.Call(parameterExpression, typeof(string).GetMethod("ToLower", Type.EmptyTypes));
var right = Expression.Constant(rule.Data.ToLower());
var method = typeof(string).GetMethod("Contains", new [] { typeof(string) });
var call = Expression.Call(left, method, right);
var lambda = Expression.Lambda<Func<T, bool>>(call, parameterExpression);
query = query.Where(lambda);
}
Варrule
имеет поле (бывшее «имя»), которое я хочу сравнить с текстом вrule.Data
(бывший "Том"). Так что еслиT.Name.Contains("tom");
Я хочу, чтобы запрос включал запись, иначе нет.
Варquery
имеет типIQueryable<T>
РЕДАКТИРОВАТЬНаконец-то получил работать с этим кодом:
foreach (var rule in request.Where.Rules)
{
var parameter = Expression.Parameter(typeof(T), "x");
var property = Expression.Property(parameter, rule.Field);
var value = Expression.Constant(rule.Data);
var type = value.Type;
var containsmethod = type.GetMethod("Contains", new[] { typeof(string) });
var call = Expression.Call(property, containsmethod, value);
var lambda = Expression.Lambda<Func<T, bool>>(call, parameter);
query = query.Where(lambda);
}