Malikdanish Ответов: 1

Поиск с несколькими столбцами с помощью entity framework в MVC


Привет у меня есть таблица курсов и ее список в индексном представлении , каждый курс содержит имя,программу,Блок,Модуль и год , список работает нормально теперь я хочу искать курсы на основе любой комбинации этих параметров, так что ниже приведены мои поля поиска
<a href="https://imge.to/i/vdroSh"></a>
программа заполняет выпадающий лет и год dorpdown заполняет выпадающие блоки и блоки выпадающем заполняет модулей . Ниже приведен мой метод intext он хорошо работает, если я даю строку имени курса в качестве параметра, но если я просто хочу найти все курсы в конкретной программе или году, блоке или модуле, то он не возвращает ничего ниже моего контроллера.

любой может поделиться полным примером поиска с несколькими столбцами несколькими строковыми параметрами и несколькими целочисленными параметрами

Что я уже пробовал:

public ActionResult Index(string sortOrder, string currentFilter, string SearchString,int? Block_Id,int? Program_Id,int? Year,int? Module_id, int? page)
{
ViewBag.Block_Id = new SelectList(db.Blocks, "Id", "Name");
ViewBag.Course_Category_Id = new SelectList(db.Courses_Category, "Id", "Category_Name");
ViewBag.Module_Id = new SelectList(db.Moduels, "Id", "Name");
ViewBag.Program_Id = new SelectList(db.Programs, "Id", "Program_Title");
ViewBag.Year = new SelectList(db.Years, "Id", "Name");
ViewBag.CurrentSort = sortOrder;
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
if (SearchString != null)
{
page = 1;
}
else
{
SearchString = currentFilter;
}
ViewBag.CurrentFilter = SearchString;
var course = from s in db.Courses
select s;
if (!String.IsNullOrEmpty(SearchString) || Block_Id != null || Program_Id != null || Year != null || Module_id != null)
{
course = course.Where(s => s.Course_Name.Contains(SearchString) || s.Program_Id==Program_Id || s.Block_Id == Block_Id || s.Module_Id==Module_id);
}
switch (sortOrder)
{
case "name_desc":
course = course.OrderByDescending(s => s.Course_Name);
break;
case "Date":
course = course.OrderBy(s => s.Date_Created);
break;
case "date_desc":
course = course.OrderByDescending(s => s.Date_Created);
break;
default:
course = course.OrderBy(s => s.Course_Name);
break;
}
int pageSize = 5;
int pageNumber = (page ?? 1);
ViewData["UserName"] = _ILogin.GetUserNamebyUserID(Convert.ToInt32(Session["UserID"]));
return View(course.ToPagedList(pageNumber,pageSize));
}

ZurdoDev

У вас есть код для одного фильтра поиска, верно? Поэтому просто сделайте то же самое и добавьте еще.

Malikdanish

Привет, не могли бы вы немного объяснить это ?

1 Ответов

Рейтинг:
2

Richard Deeming

Если вы хотите вернуть курсы, которые соответствуют всем фильтрам, это довольно просто:

var courses = db.Courses.AsQueryable();
if (!string.IsNullOrEmpty(SearchString))
{
    courses = courses.Where(s => s.Course_Name.Contains(SearchString));
}
if (Block_Id != null)
{
    courses = courses.Where(s => s.Block_Id == Block_Id);
}
if (Program_Id != null)
{
    courses = courses.Where(s => s.Program_Id == Program_Id);
}
if (Module_id != null)
{
    courses = courses.Where(s => s.Module_Id == Module_id);
}
if (Year != null)
{
    courses = courses.Where(s => s.Year == Year);
}
Если вы хотите вернуть курсы, которые соответствуют любому из фильтров вместо этого, это становится более сложным. Что-то вроде этого должно сработать:
var courses = db.Courses.AsQueryable();
var courseConditions = new List<IQueryable<Course>>();
if (!string.IsNullOrEmpty(SearchString))
{
    courseConditions.Add(courses.Where(s => s.Course_Name.Contains(SearchString)));
}
if (Block_Id != null)
{
    courseConditions.Add(courses.Where(s => s.Block_Id == Block_Id));
}
if (Program_Id != null)
{
    courseConditions.Add(courses.Where(s => s.Program_Id == Program_Id));
}
if (Module_id != null)
{
    courseConditions.Add(courses.Where(s => s.Module_Id == Module_id));
}
if (Year != null)
{
    courseConditions.Add(courses.Where(s => s.Year == Year));
}

switch (courseConditions.Count)
{
    case 0:
    {
        break;
    }
    case 1:
    {
        courses = courseConditions[0];
        break;
    }
    default:
    {
        courses = courseConditions.Aggregate((left, right) => left.Union(right));
        break;
    }
}