#c# #asp.net-mvc #filter
#c# #asp.net-mvc #Фильтр
Вопрос:
Я извлекаю подмножество записей базы данных на основе введенных пользователем критериев.
Поиск по имени успешно извлекает все записи, содержащие строку, ТОЛЬКО если строка состоит из одного слова без пробелов. При добавлении другого слова или пробела возвращается пустой результат.
Контроллер:
public IEnumerable<Product> GetProducts(ProductSearchModel searchModel)
{
var result = db.Products.AsQueryable();
if (searchModel != null)
{
if (searchModel.Id.HasValue)
result = result.Where(x => x.ProductId == searchModel.Id);
if (!string.IsNullOrEmpty(searchModel.Name))
result = result.Where(x => x.Name.Contains(searchModel.Name));
if (!string.IsNullOrEmpty(searchModel.Colour))
result = result.Where(x => x.Colour.Contains(searchModel.Colour));
if (!string.IsNullOrEmpty(searchModel.Brand))
result = result.Where(x => x.Brand.Contains(searchModel.Brand));
if (!string.IsNullOrEmpty(searchModel.Genre))
result = result.Where(x => x.Genre.Contains(searchModel.Genre));
if (searchModel.PriceFrom.HasValue)
result = result.Where(x => x.Price >= searchModel.PriceFrom);
if (searchModel.PriceTo.HasValue)
result = result.Where(x => x.Price <= searchModel.PriceTo);
}
return result.AsEnumerable();
}
Раздел представления (реализация всех полей такая же, как Model.Name ):
<div class="row">
<i class="fa fa-search"></i>
@Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
<span class="glyphicon glyphicon-chevron-down" id="advancedSearchToggle"></span>
</div>
...
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
Кто-нибудь знает, в чем может быть проблема?
Спасибо
Комментарии:
1. Можете ли вы привести пример строки, с которой вы выполняете поиск, и какие типы результатов вы хотите, чтобы они соответствовали?
2. Я ищу «Вода», и он возвращает «Вода зеленая», «Вода синяя», «Вода желтая». Если я ищу «Воду» с пробелом в конце, он ничего не возвращает. Если я ищу «Зеленый цвет воды», он ничего не возвращает.
3. Вы уверены, что тип пробела в вашей строке поиска такой же, как в БД? Возможно ли, что БД содержит что-то с вкладками вместо этого?
Ответ №1:
Попробуйте удалить пробелы.
результат = результат.Где(x => x.Name .Заменить(» «,»»).Содержит(searchModel.Name ));
Комментарии:
1. Пробелы
searchModel.Name
также присутствуют.2. Я бы также удалил их. результат = результат. Где(x => x.Name . Заменить(» «,»»).Содержит(searchModel.Name . Заменить(» «,»»)));
3. Это сработало, если я также добавлю замену в searchModel.Name:
result = result.Where(x => x.Name.Replace(" ", "").Contains(searchModel.Name.Replace(" ", "")));
4. Вы также можете взглянуть и посмотреть, как выглядит sql, сгенерированный entity framework, с помощью: context.Database . Log = s => Система. Диагностика. Отладка. Строки записи; Возможно, вы захотите создать свой собственный sql или вызвать хранимую процедуру.