例如: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
最佳答案
您可以通过在方法调用上添加等号表达式来使您的代码正常工作,如下所示:
b[i] = Expression.Equal(
Expression.Call(Expression.Property(entity, _paramList[i].Item1),
typeof (String).GetMethod("Contains"),
new Expression[] {c[i]}), Expression.Constant(true));
在伪代码中,这读作:
b[i] = entity => entity.someProperty.Contains(c[i]) == true;
这将为您返回一个二进制表达式。
关于c# - C# 中的表达式.Like,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24405020/