Практическое руководство. Динамическое определение фильтров предикатов во время выполнения (Руководство по программированию на C#)
В некоторых случаях только во время выполнения удается определить, сколько предикатов нужно применить к исходным элементам в предложении where.Одним из способов динамического определения нескольких фильтров предикатов является использование метода Contains, как показано в следующем примере.Пример состоит из двух частей.Сначала проект запускается посредством фильтрации по значениям, предоставленным в программе.Затем проект запускается повторно с использованием входных данных, предоставленных во время выполнения.
Фильтрация с помощью метода "Contains"
Откройте в Visual Studio новое консольное приложение.Присвойте ему имя PredicateFilters.
Скопируйте класс StudentClass из раздела Практическое руководство. Запрос коллекции объектов (Руководство по программированию на C#) и вставьте его в пространство имен PredicateFilters, вложив в класс Program.StudentClass предоставляет список объектов Student.
Закомментируйте метод Main в StudentClass.
Замените класс Program на следующий код.
class DynamicPredicates : StudentClass { static void Main(string[] args) { string[] ids = { "111", "114", "112" }; Console.WriteLine("Press any key to exit."); Console.ReadKey(); } 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); } } }
Добавьте в метод Main в классе DynamicPredicates под объявлением ids следующую строку.
QueryById(ids);
Чтобы запустить проект, нажмите клавишу F5.
В окне командной строки выводится следующий результат:
Garcia: 114
O'Donnell: 112
Omelchenko: 111
Следующим этапом является повторный запуск проекта, но с использованием входных данных, введенных во время выполнения, а не массива ids.В обозревателе решений щелкните правой кнопкой мыши PredicateFilters и выберите пункт Свойства.
Перейдите на вкладку Отладка.
В окне Аргументы командной строки введите значения 122, 117, 120 и 115, разделяя их пробелами: 122 117 120 115.После запуска проекта эти значения становятся элементами параметра args метода Main.
Измените значение QueryByID(ids) на QueryByID(args) в методе Main.
Чтобы запустить проект, нажмите клавишу F5.
В окне командной строки выводится следующий результат:
Adams: 120
Feng: 117
Garcia: 115
Tucker: 122
Фильтрация с использованием оператора "switch"
Оператор switch можно использовать для выбора предопределенных альтернативных запросов.В следующем примере studentQuery использует другое предложение where в зависимости от того, какой год обучения указан во время выполнения.
Скопируйте следующий метод и вставьте его в класс DynamicPredicates.
// 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. // 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.SecondYear select student; break; case GradeLevel.ThirdYear: studentQuery = from student in students where student.Year == GradeLevel.ThirdYear 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); } }
В окне Аргументы командной строки замените идентификационные номера из предыдущей процедуры на целочисленное значение между 1 и 4.
В методе Main замените вызов QueryByID на следующий вызов, который передает первый элемент массива args в качестве аргумента: QueryByYear(args[0]).
Чтобы запустить проект, нажмите клавишу F5.
Использование данного метода в своих приложениях
- Настраивая данный метод для своего приложения, помните, что для LINQ требуется .NET Framework версии 3.5 или 4, а проект должен содержать ссылку на библиотеку System.Core.dll и директиву using для библиотеки System.Linq.Типы LINQ to SQL, LINQ to XML и LINQ to DataSet требуют дополнительных директив using и ссылок.Дополнительные сведения см. в разделе Практическое руководство. Создание проекта LINQ.
См. также
Ссылки
Предложение where (Справочник по C#)
Основные понятия
Выражения запросов LINQ (Руководство по программированию на C#)