C # поиск по многим параметрам Entity Framework 6.0

#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 )