【发布时间】:2014-06-25 09:31:49
【问题描述】:
例如:x=> x.Name = "g"
我有这样的代码块
public Expression<Func<TEntity, bool>> SearchExpression()
{
var c = new ConstantExpression[_paramList.Count];
var b = new BinaryExpression[_paramList.Count];
BinaryExpression comparisonExpression = null;
var entity = Expression.Parameter(typeof(TEntity));
for (int i = 0; i < _paramList.Count; i++)
{
var value = Convert.ChangeType(_paramList[i].Item2 /*"g"*/, _paramList[i].Item3 /*System.String*/);
c[i] = Expression.Constant(value); //"g"
// PROBLEM IS HERE
b[i] = Expression.Equal(Expression.Property(entity, _paramList[i].Item1 /*Name*/, c[i]);
// PROBLEM IS HERE
}
_paramList.Clear();
comparisonExpression = b.Aggregate(Expression.And);
return Expression.Lambda<Func<TEntity, bool>>(comparisonExpression, entity);
}
像魅力一样工作,但我需要 Expression.Like (像“g”不等于“g”)
Expression.Like(Expression.Property(entity, _paramList[i].Item1), c[i])
但是C#表达式树不支持Like方法
更新:
我写了这样的东西:
Expression.Call(Expression.Property(entity, _paramList[i].Item1),
typeof(String).GetMethod("Contains"), new Expression[] { c[i] });
但我需要 BinaryExpression 而不是 MethodCallExpression
【问题讨论】:
-
我认为您需要向 string.Contains 注入方法调用。
Expression.Like不是开箱即用的表达式。 -
@Adrian Wragg,在 ExpressionTree 中不是字符串!!!!!!!!!!!!!!!
-
@user3432343 可能。如果你说不是,我会撤回接近投票。
-
Marc Gravell 做了类似的事情 here
-
@chridam,是的,我看到了,但我不能在我的代码块中使用它:(
标签: c# expression-trees sql-like