#c# #entity-framework
#c# #entity-framework
Вопрос:
В моей таблице у меня есть 4 столбца: BAZAR_TEXT
, CATEGORY
, COUNTY
, PRICE
и я хотел бы выполнять поиск записей по параметрам из текстовых полей: поиск, категория, округ, priceFrom, priceUntil
var searchResult = db.bazar.Include(c => c.images).Where(da => da.BAZAR_TEXT.Contains(search) || search == null);
var categoryResult = searchResult.Where(x => x.CATEGORY == category || category == null);
var countyResult = categoryResult.Where(x => x.DISTRICT == county || county == null);
var priceFromResult = countyResult.Where(x => x.PRICE >= priceFrom);
var priceUntilResult = priceFromResult.Where(x => x.PRICE <= priceUntil);
return View(priceUntilResult.ToList().ToPagedList(page ?? 1, 10));
и нужно вернуть список для просмотра.
Если я ищу только по результатам поиска, все в порядке
var searchResult = db.bazar.Include(c => c.images).Where(da => da.BAZAR_TEXT.Contains(search) || search == null);
return View(searchResult.ToList().ToPagedList(page ?? 1, 10));
но если я добавлю другие результаты, список будет нулевым.
Примечание: все параметры из текстовых полей могут иметь значение null, но столбцы в таблице не являются null.
Ответ №1:
var searchResult = db.bazar.Include(c => c.images).AsQueryable();
if(search != null){
searchResult = searchResult.Where(da => da.BAZAR_TEXT.Contains(search));
}
if(category != null){
searchResult = searchResult.Where(x => x.CATEGORY == category);
}
if(county != null){
searchResult = searchResult.Where(x => x.DISTRICT == county);
}
if(priceFrom != null){
searchResult = searchResult.Where(x => x.PRICE == priceFrom);
}
if(priceUntil != null){
searchResult = searchResult.Where(x => x.PRICE <= priceUntil);
}
return View(searchResult.ToList().ToPagedList(page ?? 1, 10));
Комментарии:
1. Хотя этот фрагмент кода может ответить на вопрос OP, этот ответ был бы гораздо более полезным для будущих посетителей, если вы объясните, почему он решает проблему.
Ответ №2:
Между ними есть разница null and string empty
. Поэтому, если вы выполняете поиск с пустым текстовым полем:
WebEntities db = new WebEntities();
var searchResult = db.bazar.Include(c => c.images);
if (!string.IsNullOrEmpty(search))
{
searchResult = searchResult.Where(da => da.BAZAR_TEXT.Contains(search));
}
if (!string.IsNullOrEmpty(category))
{
searchResult = searchResult.Where(x => x.CATEGORY == category);
}
if (!string.IsNullOrEmpty(county))
{
searchResult = searchResult.Where(x => x.DISTRICT == county);
}
if (priceFrom != null)
{
searchResult = searchResult.Where(x => x.PRICE >= priceFrom);
}
if (priceUntil != null)
{
searchResult = searchResult.Where(x => x.PRICE <= priceUntil);
}
return View(searchResult.ToList().ToPagedList(page ?? 1, 10));
Ответ №3:
Вам следует изменить порядок вычисления условий .Where(x => x.CATEGORY == category || category == null)
Для
.Where(x => category == null || x.CATEGORY == category )