If you want to return courses which match all filters, it's quite simple:
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);
}
If you want to return courses which match any one of the filters instead, it gets more complicated. Something like this should work:
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;
}
}