LinqKit PredicateBuilder возвращает все или не строки

Я начинаю использовать LinqKit PredicateBuilder для создания предикатов с условиями ИЛИ, что невозможно с выражениями Linq.

Проблема, с которой я сталкиваюсь, заключается в том, что если я начинаю с PredicateBuilder.True<MyEntity>(), он возвращает все строки, а если я начинаю с PredicateBuilder.False<MyEntity>(), он возвращает не строки, независимо от того, какие выражения я использую! посмотрите на код ниже:

        var pre = PredicateBuilder.True<MyEntity>();
        pre.And(m => m.IsActive == true);

        using (var db = new TestEntities())
        {
            var list = db.MyEntity.AsExpandable().Where(pre).ToList();
            dataGridView1.DataSource = list;
        }

Он должен возвращать строки с IsActive == true, но возвращает все строки!

Я перепробовал все возможные комбинации PredicateBuilder.True | PredicateBuilder.False с And | Or методов, ни один из них не работает!


person Ashkan    schedule 10.03.2013    source источник


Ответы (2)


Метод-расширения And не изменяет исходный предикат — он возвращает новый предикат, представляющий исходный предикат ANDed вместе с указанным предикатом.

По сути, ваши операции не изменяют предикат, на который ссылается ваша переменная pre, то есть вы получаете либо все записи, либо ни одну из них, в зависимости от того, инициализировали ли вы исходный предикат true или false.

Пытаться:

    var pre = PredicateBuilder.True<MyEntity>();
    pre = pre.And(m => m.IsActive);

Если вы планируете использовать OR предикатов вместе, не забудьте начать с false начального предиката.

    var pre = PredicateBuilder.False<MyEntity>();
    pre = pre.Or(m => m.IsActive);
person Ani    schedule 10.03.2013
comment
МОЙ БОГ!! Это глупая ошибка. Я сделал ту же ошибку с методом string.Replace 3 года назад!!! Спасибо большое. - person Ashkan; 10.03.2013
comment
Спасибо за разъяснения - person leen3o; 18.10.2015

Вы забыли назначить пре, как сказала Ани

pre = pre.And(m => m.IsActive);
person GSKKC    schedule 04.12.2019