Создайте простое дерево выражений в .NET - PullRequest
0 голосов
/ 12 августа 2011

У меня есть интерфейс, в котором пользователь указывает некоторые элементы и операторы между ними, и я должен отобразить результат.

Пользователь может построить фильтр, например p1 OP v1 OR p2 OP v2, где p1 и p2 - это свойства Person, например Age, Name, Location и т. Д., v1 и v2 - сравнительные значения (10, «Мария», 'LA'), OP - операторы сравнения (=, <,>), а OR - логический оператор (также может быть AND).

Например:
Age > 18 AND Location = 'Paris' или другой, например
Name Contains 'andro' AND Sex = 'm'

Имея коллекцию myPeople и эту строку фильтра, как я могу создать и применить это выражение с помощью Linq.Expressions?

Я пытался использовать DynamicLinq , но на самом деле у меня проблема с использованием "Где" на List<Person>, по-видимому, не IQueryable ...

1 Ответ

1 голос
/ 12 августа 2011

Если вы пытаетесь использовать его с List<T>, я бы не стал использовать деревья выражений для начала:

public static Func<T, bool> Or<T>(Func<T, bool> predicate1,
                                  Func<T, bool> predicate2)
{
    return t => predicate1(t) || predicate2(t);
}

public static Func<T, bool> And<T>(Func<T, bool> predicate1,
                                   Func<T, bool> predicate2)
{
    return t => predicate1(t) && predicate2(t);
}

Тогда вы можете сделать:

Func<Person, bool> isAdult = person => person.Age > 18;
Func<Person, bool> isInParis = person => person.Location == "Paris";

var personInParis = And(isAdult, isInParis);

Эквивалент для деревьев выражений, если вы хотите их позже, посмотрите на PredicateBuilder.

Сложный бит, вероятно, будет преобразовывать вашу строку в дерево выражений для начала.

Если Dynamic LINQ делает все, что вы хотите иначе , вы можете просто использовать AsQueryable для создания IQueryable<T> из IEnumerable<T>.

...