Есть ли значение по умолчанию для выражения, которое не влияет на него? - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть фильтр по некоторым проектам в моем приложении. Он работает с использованием запроса Expression, который в начале равен NULL.

Во время фильтрации существует много операторов IF, которые проверяют, имеет ли значение NULL запрос. Мне нужно избегать повторений, но проблема в том, что я не могу добавить условие, например query.And (exp), если query NULL.

Итак, перед добавлением условия - переменная запроса должна иметь значение. Моя первая идея - добавить условие и удалить его перед применением фильтра, но я не смог удалить его из тела, потому что это не строка, и я не нашел таких методов для него. Затем я попытался добавить условие, которое указывает фильтру принимать проекты с идентификатором, равным MAXINT, но это не работает, потому что тело запроса выглядит как {p => p.ID == 2147483647 И также}. Не ИЛИ, но И ТАКЖЕ. Таким образом, в результате получилось 0 проектов.

            Expression<Func<Project, bool>> query = null, exp = null;

Вот как это работает сейчас в каждом операторе IF:

            if (filter.ViewSomeProjects)
            {
                exp = p => (some conditions);
                query = query != null ? query.And(exp) : exp;                
            }

Вот как я хочу, чтобы это работало:

            if (filter.ViewSomeProjects)
            {
                query.And(some conditions);                    
            }

Так что я не могу делать это так, как хочу, хотя запрос в начале равен NULL.

Мои вопросы: есть ли способ удалить часть тела выражения? Можно ли добавить в выражение бесполезное условие, которое не повлияет на результат?

1 Ответ

1 голос
/ 29 апреля 2019

Predicate Builder от Joe Albahari имеет True и False, которые вы можете использовать в качестве отправной точки.

public static Expression<Func<T, bool>> True<T> ()  { return f => true;  }
public static Expression<Func<T, bool>> False<T> () { return f => false; }

Если вы начнете с одного из них, выЗатем можно создать запрос в зависимости от поведения по умолчанию (обычно True работает нормально при добавлении ограничений по умолчанию для «всех результатов»).

...