Как обрабатывать пустые поля при поиске / фильтрации данных? - PullRequest
0 голосов
/ 14 февраля 2019

Я борюсь с алгоритмом поиска данных, который должен извлекать некоторые данные из базы данных, используя несколько полей.Каждое текстовое поле предоставляет определенный параметр, хранящийся в базе данных, доступ к которой осуществляется Entity Framework.Это работает, когда я ввожу данные во все поля, но если я оставляю любое поле пустым, он не получает никакой записи.Мой вопрос - как обрабатывать пустые поля.Если я оставлю любое поле без данных, он просто не должен учитывать этот параметр при выборе из базы данных и выбирать данные на основе ненулевых параметров.

Это то, что я создал до сих пор:

   [HttpPost]
   public ViewResult Search(string brand, string model, int? manufactDateMin,
       int? manufactDateMax, int? priceMin, int? priceMax, int? engineCapMin,
       int? engineCapMax, string engineType, int page = 1)
   {

       IEnumerable<Car> foundItems = repository.Cars
           .Where(c => brand == null || c.Brand == brand)
           .Where(c => model == null || c.Model == model)
           .Where(c => manufactDateMin == null || manufactDateMax == null || (c.ManufactDate.Year >= manufactDateMin) && (c.ManufactDate.Year < manufactDateMax))
           .Where(c => priceMin == null || priceMax == null || (c.Price >= priceMin) && (c.Price < priceMax))
           .Where(c => engineCapMin == null || engineCapMax == null || (c.EngineCapacity >= engineCapMin) && (c.EngineCapacity < engineCapMax))
           .Where(c => engineType == null || c.EngineType == engineType)
           .OrderBy(c => c.Id)
           .Skip(PageSize * (page - 1))
           .Take(PageSize);

       CarListViewModel VMmodel = new CarListViewModel
       {
           Cars = foundItems,
           PagingInfo = new PagingInfo
           {
               CurrentPage = page,
               ItemsPerPage = PageSize,
               TotalItems = foundItems.Count(),
           },
           CarType = null
       };

       return View("List", VMmodel);
   }

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Я думаю, что вы должны сделать это отдельно, как это

IQueryable<Car> query  = repository.Cars;

if (!string.IsNullOrEmpty(brand))
{
 query = query.Where(x => x.Brand  == brand);
}
if (!string.IsNullOrEmpty(model ))
{
 query = query.Where(x => x.Model == model );
}

, и после того, как вы все поставите take и skyp, это быстрее и более читабельно

0 голосов
/ 14 февраля 2019

Не используйте новый оператор where для каждого сравнения.объединить их в одну.разделите их на новую строку для удобства чтения.Кроме того, ваши параметры определены как строки, но вы сравниваете их с нулем.Вы должны будете передать ноль, чтобы это работало.Если вы передаете содержимое текстового поля или чего-то еще, тогда строка будет "", а не нулем.

.Where(c => brand == "" || c.Brand == brand) &&
       (model == "" || c.Model == model) &&
       ((manufactDateMin == null || manufactDateMax == null || (c.ManufactDate.Year >= manufactDateMin) && (c.ManufactDate.Year < manufactDateMax)) &&
       (priceMin == null || priceMax == null || (c.Price >= priceMin) && (c.Price < priceMax))) &&
       (engineCapMin == null || engineCapMax == null || (c.EngineCapacity >= engineCapMin) && (c.EngineCapacity < engineCapMax))) &&
       (engineType == "" || c.EngineType == engineType))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...