c# - C# 中的表达式.Like

标签 c# expression-trees sql-like

例如: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/

相关文章:

Java Criteria API 类似条件

c# - 在表达式树中,如何使用需要与结果进行比较的表达式,例如。指数?

c# - 使用 VS2015 Update 1 编译时表达式破坏代码

c# - 网络核心 : Find Data Type for any Variable Field in Class

mysql - 在 mysql 中使用 AES_ENCRYPT 和 AES_DECRYPT 搜索 LIKE

不带通配符的 SQL LIKE 与 '=' 相同吗?

c# - python 和 .net 上使用单个公钥加密的不同答案

c# - 是否需要有人注册才能发起事件?

c# - WPF C#设计题中绘制图表

c# - 将 [Authorize] 属性与用户的电子邮件一起使用