PredicateBuilder Содержит разрывы, когда значение равно нулю - PullRequest
0 голосов
/ 10 марта 2020

Похоже, что моя функция LinqKit Predicatebuilder прерывается, когда значение FirstName или LastName = null.

public partial class Student
{
    public int id { get; set; } // PK
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

private Expression<Func<Student, bool>> BuildDynamicWhereClause(string searchValue)
{
    // simple method to dynamically plugin a where clause
    var predicate = PredicateBuilder.New<Student>(true); // true -where(true) return all

    if (String.IsNullOrWhiteSpace(searchValue) == false)
    {
        var searchTerms = searchValue.Split(' ').ToList().ConvertAll(x => x.ToLower());

        predicate = predicate.Or(s => searchTerms.Any(srch => s.FirstName.Contains(srch)));
        predicate = predicate.Or(s => searchTerms.Any(srch => s.LastName.Contains(srch)));
    }
    return predicate;
}

Как переписать predicate.Or(s => searchTerms.Any(srch => s.FirstName.Contains(srch)));, так как для Contains требуется значение для поиска и выдается исключение?

Я пробовал:

predicate = predicate.Or(s => searchTerms.Any(srch => s.FirstName == null ? false : s.FirstName.Contains(srch)));

, а также

predicate = predicate.Or(s => searchTerms.Any(srch => s.FirstName == null ? true : s.FirstName.Contains(srch)));

, который компилируется, но теперь имя FirstName не ищется.

1 Ответ

1 голос
/ 10 марта 2020

Используйте условный оператор null . Этот код вызывает только Contains, если FirstName не равно нулю, избегая исключения.

searchTerms.Any(srch => s.FirstName?.Contains(srch) == true));

Явное == true необходимо, поскольку это значение равно bool?, а не bool.

Для провайдеров LINQ, которые не поддерживают этого оператора, он по сути такой же, как

searchTerms.Any(srch => s.FirstName == null ? false : s.FirstName.Contains(srch));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...