Я думаю, что написание небольшого поиска Func<>
было бы хорошим способом выполнить поиск по нескольким свойствам в модели. Он может использовать Reflection
, чтобы сделать его более общим, но мы постараемся сделать его простым.
Предполагается, что ваша Книга модель выглядит следующим образом
public class Book
{
public string Title { get; set; }
public string Author { get; set; }
public string ISBN { get; set; }
}
Теперь давайте создадим простое Regex
private bool IsMatch(string input, string pattern)
{
return Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase);
}
Мы собираемся повторно использовать эту функцию в поиске Func<>
, который мы собираемся создать и использовать для фильтрации книг.
Func<>
в основном похож на вызов функции, который может иметь входные и возвращаемые значения.
Давайте посмотрим наш поиск функции
Func<Book, bool> searchFunc = (book) =>
{
string query = $"({q})";
if (IsMatch(book.Title, query) || IsMatch(book.Author, query) ||
IsMatch(book.ISBN, query)
{
return true;
}
return false;
};
Давайте наконец соединим это в нашем действии индекса
public IActionResult Index(string q)
{
Func<Book, bool> searchFunc = (book) =>
{
string query = $"({q})";
if (IsMatch(book.Title, query) || IsMatch(book.Author, query) ||
IsMatch(book.ISBN, query))
{
return true;
}
return false;
};
var books = _bookstoreData.GetAll()
.Where(searchFunc)
.ToList();
return books.Count > 0 ? View("SearchResult", books) : View(books);
}
Надеюсь, это поможет.