Поиск и сравнение входной строки из приложения .Net Core с несколькими столбцами SQL - PullRequest
0 голосов
/ 05 марта 2019

Извините, если способ, которым я задал вопрос, сбивает с толку. У меня есть проект электронной сети .Net Core, который продает музыкальные альбомы. Я хочу добавить панель поиска, чтобы пользователь мог искать альбомы по названию, исполнителю или жанру. Они хранятся в базе данных SQL. Я не могу найти способ сравнить строку, которую вводит пользователь, со всеми тремя из них, только одна. Вот что у меня есть:

public ViewResult Search(string searchString)
        {
            string _searchString = searchString;
            IEnumerable<Album> albums;


            if (string.IsNullOrEmpty(_searchString))
            {
                albums = _albumRepository.Albums.OrderBy(p => p.AlbumId);
            }
            else 
            {
                albums = _albumRepository.Albums.Where(p => p.Name.ToLower().Contains(_searchString.ToLower()));

            }

            return View("~/Views/Album/List.cshtml", new AlbumListViewModel { Albums = albums});
        }

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Если у вас много условий, вы можете переместить код в метод, чтобы улучшить читаемость / повторное использование:

albums = _albumRepository.Albums.Where(p => p.Match(searchString))

Затем создайте метод расширения для типа p (Albums class) или просто добавьте его в сам класс, если в вашем проекте будет больше смысла.

public static class AlbumsExtensions
{
    public static bool Match(this Album album, string search)
    {

        // whatever complex logic you have stays here

        var search = searchString.ToLower();

        var result = p.Name.ToLower().Contains(search) ||
                     p.Artist.ToLower().Contains(search) ||
                     p.Genre.ToLower().Contains(search);

        return result ;
    }
}

И последнее, но не менее важное: обратите внимание, что сравнение строк не является тривиальным, если вы поддерживаете Unicode и несколько языков.

Для получения дополнительной информации посмотрите (например): Без учета регистра 'Содержит (строка)'

0 голосов
/ 05 марта 2019

Сложно ответить, учитывая, что мы не можем видеть ваши фактические модели здесь, но, вообще говоря, вам просто нужно использовать логический оператор ИЛИ:

albums = _albumRepository.Albums.Where(p =>
    p.Name.ToLower().Contains(_searchString.ToLower()) ||
    p.Artist.ToLower().Contains(_searchString.ToLower()) ||
    p.Genre.ToLower().Contains(_searchString.ToLower())
);

Если Artist / Genre на самом деле являются опорными реквизитами, вы просто углубитесь в них, т. Е. p.Artist.Name.ToLower().Contains(...) и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...