# Dynamically specify predicate filters at run time

In some cases, you don't know until run time how many predicates you have to apply to source elements in the where clause. One way to dynamically specify multiple predicate filters is to use the Contains method, as shown in the following example. The query will return different results based on the value of id when the query is executed.

int[] ids = { 111, 114, 112 };

var queryNames =
from student in students
where ids.Contains(student.ID)
select new
{
student.LastName,
student.ID
};

foreach (var name in queryNames)
{
Console.WriteLine($"{name.LastName}: {name.ID}"); } /* Output: Garcia: 114 O'Donnell: 112 Omelchenko: 111 */ // Change the ids. ids = new[] { 122, 117, 120, 115 }; // The query will now return different results foreach (var name in queryNames) { Console.WriteLine($"{name.LastName}: {name.ID}");
}

/* Output:
Feng: 117
Garcia: 115
Tucker: 122
*/


## Using different queries at runtime

You can use control flow statements, such as if... else or switch, to select among predetermined alternative queries. In the following example, studentQuery uses a different where clause if the runtime value of oddYear is true or false.

void FilterByYearType(bool oddYear)
{
IEnumerable<Student> studentQuery;
if (oddYear)
{
studentQuery =
from student in students
select student;
}
else
{
studentQuery =
from student in students
select student;
}

string descr = oddYear ? "odd" : "even";
Console.WriteLine($"The following students are at an {descr} year level:"); foreach (Student name in studentQuery) { Console.WriteLine($"{name.LastName}: {name.ID}");
}
}

FilterByYearType(true);

/* Output:
The following students are at an odd year level:
Fakhouri: 116
Feng: 117
Garcia: 115
Mortensen: 113
Tucker: 119
Tucker: 122
*/

FilterByYearType(false);

/* Output:
The following students are at an even year level: