Linq Query с содержанием и значением Nullable - PullRequest
3 голосов
/ 08 апреля 2011

У меня есть метод поиска, который выглядит следующим образом:

public IEnumerable<Result> Search(string searchText)
{

     return _context.Person.Where(x => x.Contains(searchText));
}

Я хочу иметь возможность вызывать эту функцию, если searchText равно нулю / пусто и получить все записи обратно.

Я попробовал это безуспешно:

return _context.Person.Where(x => x.Contains(searchText ?? ""));

есть еще один способ сделать это, кроме разбивки на два шага и проверки searchString в операторе if перед его применением к запросу.

Ответы [ 7 ]

5 голосов
/ 08 апреля 2011
public IEnumerable<Result> Search(string searchText)
{
    if(string.IsNullOrEmpty(searchText))
        return _context.Person;
    else
        return _context.Person.Where(x => x.Contains(searchText));
}
4 голосов
/ 08 апреля 2011
_context.Person.Where(x => string.IsNullOrEmpty(searchText) ? true : x.Contains(searchText));
0 голосов
/ 29 июня 2019

Я пробую все решения, и у меня работает чуть ниже решение

query = query.Where(e =>  e.CategoryType.HasValue && categoryTypes.Contains(e.CategoryType.Value));

Проблемы

0 голосов
/ 08 апреля 2011

Предполагая, что Person является классом Contains, похоже, является методом этого класса. Выражение типа Where(x => x.Contains(searchText)) или Where(x => string.IsNullOrEmpty(searchText) || x.Contains(searchText)), где x - это Person, вообще не будет работать с LINQ to Entities, даже с таким простым классом, как ...

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }

    public bool Contains(string searchText)
    {
        return Name.Contains(searchText);
    }
}

... это вызовет исключение, потому что LINQ to Entities не может преобразовать этот метод в выражение хранилища. Where(x => string.IsNullOrEmpty(searchText) || x.Name.Contains(searchText)) будет работать, хотя.

0 голосов
/ 08 апреля 2011

И менее эффективный способ ... Не уверен, что это семантически правильно, но вы поняли ...

return _context.Person.Where((x, index) => x.Contains(searchText ?? x[index]));
0 голосов
/ 08 апреля 2011

Вы можете сделать это следующим образом:

return _context.Person.Where(x => 
   string.IsNullOrEmpty(searchText) || 
   x.Contains(searchText)
);

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

0 голосов
/ 08 апреля 2011
return _context.Person.Where(x =>string.IsNullOrEmpty(searchText) ? true : x.Contains(searchText));

или

public IEnumerable<Result> Search(string searchText)
    {
        return string.IsNullOrEmpty(searchText) ? _context.Person : _context.Person.Where(x => x.Contains(searchText));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...