Практическое руководство. Динамическое определение фильтров предикатов во время выполнения (Руководство по программированию на C#)
Обновлен: Ноябрь 2007
В некоторых случаях только во время выполнения удается определить, сколько предикатов нужно применить к исходным элементам в предложении where. Одним из способов динамического определения нескольких фильтров предикатов является использование метода Contains, как показано в следующем примере.
Пример
// To run this sample, first specify some integer values for the command line.
// The numbers 111 through 122 are all valid student IDs.
// In Visual Studio or C# Express, click on Project > Properties > Debug.
// Call the method: QueryByID(args);
static void QueryByID(string[] ids)
{
var queryNames =
from student in students
let i = student.ID.ToString()
where ids.Contains(i)
select new { student.LastName, student.ID };
foreach (var name in queryNames)
{
Console.WriteLine("{0}: {1}", name.LastName, name.ID);
}
}
/*
Output (depends on args):
111 114 118
Garcia: 114
Garcia: 118
Omelchenko: 111
*/
Если нужно выбирать между предварительно определенными альтернативными запросами, можно использовать оператор switch. В следующем примере studentQuery различается тем, где к командной строке стоит предложение, от которого зависит год обучения.
// To run this sample, first specify an integer value of 1 to 4 for the command line.
// This number will be converted to a GradeLevel value that specifies which set of students
// to query. In Visual Studio or C# Express, click on Project > Properties > Debug to specify
// command line arguments.
// Call the method: QueryByYear(args[0]);
static void QueryByYear(string level)
{
GradeLevel year = (GradeLevel)Convert.ToInt32(level);
IEnumerable<Student> studentQuery = null;
switch (year)
{
case GradeLevel.FirstYear:
studentQuery = from student in students
where student.Year == GradeLevel.FirstYear
select student;
break;
case GradeLevel.SecondYear:
studentQuery = from student in students
where student.Year == GradeLevel.FirstYear
select student;
break;
case GradeLevel.ThirdYear:
studentQuery = from student in students
where student.Year == GradeLevel.FirstYear
select student;
break;
case GradeLevel.FourthYear:
studentQuery = from student in students
where student.Year == GradeLevel.FourthYear
select student;
break;
default:
break;
}
Console.WriteLine("The following students are at level {0}", year.ToString());
foreach (Student name in studentQuery)
{
Console.WriteLine("{0}: {1}", name.LastName, name.ID);
}
}
Компиляция кода
В этом примере содержатся ссылки на объекты, определенные в образце приложения в разделе Практическое руководство. Запрос коллекции объектов (руководство по программированию на C#). Чтобы скомпилировать и запустить эти примеры, вставьте их в класс StudentClass в этом приложении и добавьте вызов метода из метода Main.
Настраивая данный метод для своего приложения, помните, что для LINQ требуется .NET Framework версии 3.5, и проект должен содержать ссылку на библиотеку System.Core.dll и директиву Using для библиотеки System.Linq. Типы LINQ to SQL, LINQ to XML и LINQ to DataSet требуют дополнительных директив Using и ссылок. Дополнительные сведения см. в разделе Практическое руководство. Создание проекта LINQ.
В примере Пример динамического запроса показан другой подход для динамической конструкции запроса с LINQ.
См. также
Основные понятия
Выражения запросов LINQ (Руководство по программированию в C#)