Я создаю приложение WinForms, которое ищет книги в базе данных.
У меня есть четыре таблицы: Автор, Книга, Страна, Жанр;
В таблице "Книга" есть поле "Год".Я добавил поля startDate и endDate , чтобы он мог искать определенную книгу, выпущенную в течение указанных двух лет (startDate и endDate оба являются целыми числами).Вот тут и начались мои неприятности.
Вот как я анализирую входы.
int startDateResult = 0;
int? startDate = null;
if (inputStartDate == string.Empty)
{
startDate = null;
}
else
{
if (Int32.TryParse(inputStartDate, out startDateResult))
{
startDate = startDateResult;
}
else throw new Exception("Please input correct year");
}
int endDateResult = 0;
int? endDate = null;
if (inputEndDate == string.Empty)
{
endDate = null;
}
else
{
if (Int32.TryParse(inputEndDate, out endDateResult))
{
endDate = endDateResult;
}
else throw new Exception("Please input correct year");
}
Это запрос LINQ, который я использую для поиска.
specificBookForAuthor = _context.Books.Where(c =>
(c.Author.Name.Contains(First) || c.Author.Surname.Contains(Last))
&& book==string.Empty?true: c.Name.Contains(book)
&& country == string.Empty ? true : c.Author.Country.Name.Contains(country)
&& genre == string.Empty ? true : c.Genre.Name.Contains(genre)
&& inputYear == string.Empty ? true : c.Year==year
&& inputStartDate == string.Empty ? true : c.Year >= startDate
&& inputEndDate == string.Empty ? true : c.Year <= endDate
).Select(b => b).ToList();
Этот запрос не работал.Затем я попытался прокомментировать все строки, кроме «inputEndDate», набрал 0 в startDate и 5000 в endDate.После отладки выяснилось, что число «specificBookAuthor» равно 1. Который был ПРАВИЛЬНЫЙ.
Комментарий к коду:
specificBookForAuthor = _context.Books.Where(c =>
(c.Author.Name.Contains(First) || c.Author.Surname.Contains(Last))
//&& book==string.Empty?true: c.Name.Contains(book)
//&& country == string.Empty ? true :
// c.Author.Country.Name.Contains(country)
// && genre == string.Empty ? true : c.Genre.Name.Contains(genre)
// && inputYear == string.Empty ? true : c.Year==year
// && inputStartDate == string.Empty ? true : c.Year >= startDate
inputEndDate == string.Empty ? true : c.Year <= endDate
).Select(b => b).ToList();
То же самое сделал с inputStartDate (закомментированная строка inputEndDate и незакомментированная inputStartDate).Работал нормально.
Проблема возникает, когда я оставляю оба поля без комментариев.Например:
specificBookForAuthor = _context.Books.Where(c =>
(c.Author.Name.Contains(First) || c.Author.Surname.Contains(Last))
//&& book==string.Empty?true: c.Name.Contains(book)
//&& country == string.Empty ? true :c.Author.Country.Name.Contains(country)
// && genre == string.Empty ? true : c.Genre.Name.Contains(genre)
// && inputYear == string.Empty ? true : c.Year==year
&& inputStartDate == string.Empty ? true : c.Year >= startDate
&& inputEndDate == string.Empty ? true : c.Year <= endDate
).Select(b => b).ToList();
В этом случае значение «specificBookAuthor» равно NULL вместо 1.