c# - 如何为 Like 创建 System.Linq.Expressions.Expression?

标签 c# linq lambda expression

我创建了一个可过滤的绑定(bind)列表 from this source .效果很好:

list.Filter("Customer == 'Name'");

做它应该做的。内部结构像解析器一样工作,将表达式 ==!= 转换为 System.Linq.Expressions.Expression。在这种情况下,== 变为 System.Linq.Expressions.Expression.Equal

不幸的是 System.Linq.Expressions.Expression 不包含 like 运算符,我不知道如何解决这个问题。

初始代码如下所示:

private static Dictionary<String, Func<Expression, Expression, Expression>> 
    binaryOpFactory = new Dictionary<String, Func<Expression, Expression, Expression>>();

static Init() {
    binaryOpFactory.Add("==", Expression.Equal);
    binaryOpFactory.Add(">", Expression.GreaterThan);
    binaryOpFactory.Add("<", Expression.LessThan);
    binaryOpFactory.Add(">=", Expression.GreaterThanOrEqual);
    binaryOpFactory.Add("<=", Expression.LessThanOrEqual);
    binaryOpFactory.Add("!=", Expression.NotEqual);
    binaryOpFactory.Add("&&", Expression.And);
    binaryOpFactory.Add("||", Expression.Or);
}

然后我创建了一个表达式来执行我想要的操作:

private static System.Linq.Expressions.Expression<Func<String, String, bool>>
    Like_Lambda = (item, search) => item.ToLower().Contains(search.ToLower());

private static Func<String, String, bool> Like = Like_Lambda.Compile();

例如

Console.WriteLine(like("McDonalds", "donAld")); // true
Console.WriteLine(like("McDonalds", "King"));   // false

但是 binaryOpFactory 需要这样:

Func<Expression, Expression, Expression>

预定义的表达式似乎就是这样:

System.Linq.Expressions.Expression.Or;

谁能告诉我如何转换我的表情?

最佳答案

类似于:

static IEnumerable<T> WhereLike<T>(
        this IEnumerable<T> data,
        string propertyOrFieldName,
        string value)
{
    var param = Expression.Parameter(typeof(T), "x");
    var body = Expression.Call(
        typeof(Program).GetMethod("Like",
            BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public),
            Expression.PropertyOrField(param, propertyOrFieldName),
            Expression.Constant(value, typeof(string)));
    var lambda = Expression.Lambda<Func<T, bool>>(body, param);
    return data.Where(lambda.Compile());
}
static bool Like(string a, string b) {
    return a.Contains(b); // just for illustration
}

Func<Expression,Expression,Expression>而言:

static Expression Like(Expression lhs, Expression rhs)
{
    return Expression.Call(
        typeof(Program).GetMethod("Like",
            BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public)
            ,lhs,rhs);
}

关于c# - 如何为 Like 创建 System.Linq.Expressions.Expression?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/956743/

相关文章:

c# - 使用双重检查锁定的内存读取可见性排序与写入顺序

C#:如何在运行时向对象添加属性?

c# - 使用 c# lambdas 进行递归非二进制、非排序树搜索

c# - 同时锁定多个文件

c# - 如何删除一条记录?

c# - 将字符串转换为 Linq lambda 表达式

c# - 如何从 LINQ 中的列列表中选择非空值

c# - 删除 list<string> 中的所有字母并对其进行排序

java - 有什么办法可以规避 lambda 表达式的类型化?

Python lambda 列表 : different behavior of list comprehension, for 和 for 在函数中