Поиск по регулярному выражению при построении выражения LINQ с использованием классов Expression - PullRequest
2 голосов
/ 27 сентября 2011

Здесь - пост, описывающий способ динамического создания предиката Expression<Func<MyClass, bool>>. Вот фрагмент кода:

 var param = Expression.Parameter(typeof(string), "p");
    var len = Expression.PropertyOrField(param, "SomeText");
    var body = Expression.Equal(
        len, Expression.Constant("Text"));

    var lambda = Expression.Lambda<Func<string, bool>>(
        body, param);

Интересно, как применить регулярное выражение к строке вместо равенства? Есть ли возможность? Возможный псевдокод будет выглядеть так:

 var param = Expression.Parameter(typeof(string), "p");
    var len = Expression.PropertyOrField(param, "SomeText");
    var body = Expression.Regexp(
        len, @"\D+");

    var lambda = Expression.Lambda<Func<string, bool>>(
        body, param);

1 Ответ

1 голос
/ 27 сентября 2011

Вы можете использовать Expression.Call(Type type, string methodName, Type[] typeArguments, params Expression[] arguments) для вызова вашего тестового метода, который проверяет регулярное выражение.

 List<string> lista = new List<string>() { "aaaa", "aaabb", "aaacccc", "eee" };

        var param = Expression.Parameter(typeof(string), "s");
        var pattern = Expression.Constant("\\Aa");

        var test = Expression.Call(typeof(Regex), "IsMatch", null, param, pattern);

        var lambda = Expression.Lambda<Func<string, bool>>(test, param);

        IEnumerable<string> query = lista.Where(lambda.Compile());

        foreach (string s in query) 
        {
            Console.WriteLine(s);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...