为字符串生成表达式树.包含
本文关键字:包含 表达式 字符串 | 更新日期: 2023-09-27 17:56:39
我正在努力构建表达式树,以便我可以动态地对某些数据进行过滤。
我想出了这个,但它在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);
}
var rule
有一个字段(例如"名称"),我想将其与rule.Data
中的文本(例如"tom")进行比较。 因此,如果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);
}
你几乎在那里,但你的参数表达式应该是类型 T
,而不是 String
,你也缺少从类型T
(如 name)获取属性的表达式。
你应该大致拥有的是这个
val -> Expression.Constant(typeof(string), rule.Field)
parameter -> Expression.Parameter(typeof(T), "p")
property -> Expression.Property(parameter, "PropertyName")
contains -> Expression.Call(property, containsmethod, val)
equals true -> Expression.True or equals, something like that
我写意了所有这些,所以它的有效性可能有些不同。生成的表达式应如下所示
p => p.Name.Contains(val)
如果要创建Where
查询,则必须创建lambda
然后在查询时调用Where
并传递lambda
。试试这个:
Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(call, parameter);
MethodCallExpression expression = Expression.Call(typeof(Queryable), "Where",
new[] { typeof(T) }, query.Expression, lambda);
query = query.Provider.CreateQuery<T>(expression);
而不是
var result = Expression.IsTrue(call);
query = query.Provider.CreateQuery<T>(result);