Como especificar filtros predicados dinamicamente em tempo de execução (Guia de Programação em C#)
Em alguns casos você não souber até o runtime predicados quantas você deve aplicar a elementos de origem na where cláusula. Uma forma de especificar dinamicamente os vários filtros de predicado é usar o Contains``1 método, conforme mostrado no exemplo a seguir. O exemplo é construído de duas maneiras. Em primeiro lugar, o projeto é executado pela filtragem nos valores que são fornecidos no programa. Em seguida, o projeto é executado novamente usando a entrada fornecida em tempo de execução.
Para filtrar usando o método Contains
Abra um novo aplicativo de console em Visual Studio. Name it PredicateFilters.
Cópia do StudentClass de classe de Como consultar uma coleção de objetos (Guia de Programação em C#) e cole-o no espaço para nome PredicateFilters sob a classe Program. StudentClassFornece uma lista de Student objetos.
Comente a Main método na StudentClass.
Substituir a classe Program com o código a seguir.
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); } } }
Adicione a seguinte linha para o Main método na classe DynamicPredicates, sob a declaração de ids.
QueryById(ids);
Pressione F5 para executar o projeto.
A seguinte saída é exibida em uma janela de Prompt de comando:
Garcia: 114
O ' Donnell: 112
Omelchenko: 111
A próxima etapa é executar o projeto novamente, desta vez usando a entrada inserido em tempo de execução em vez de matriz ids. Em Solution Explorer, com o botão direito PredicateFilters e, em seguida, clique em Propriedades.
Clique na guia Debug.
No argumentos de linha de comando janela, tipo 122, 117, 120 e 115, separados por espaços: 122 117 120 115. Quando o projeto é executado, esses valores se tornam elementos de args, o parâmetro da Main método.
Change QueryByID(ids) to QueryByID(args) in the Main method.
Pressione F5 para executar o projeto.
A seguinte saída é exibida em uma janela de Prompt de comando:
Adams: 120
Feng: 117
Garcia: 115
Tucker: 122
Filtrar usando uma instrução switch
Você pode usar um switch predeterminados de instrução para selecionar entre consultas alternativas. No exemplo a seguir, studentQuery usa um diferente where cláusula dependendo de qual nível nível ou ano, é especificado em tempo de execução.
O seguinte método de copiar e colá-lo na classe 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); } }
No argumentos de linha de comando janela, números de substituir a identificação do procedimento anterior com um valor inteiro entre 1 e 4.
No Main método, substituir a chamada para QueryByID com a seguinte chamada, que envia o primeiro elemento da args matriz como seu argumento: QueryByYear(args[0]).
Pressione F5 para executar o projeto.
Para usar esse método em seus próprios aplicativos
- Quando você adapta este método para seu próprio aplicativo, lembre-se de que o LINQ requer a versão 3.5 ou 4 da .NET Framework, e que o projeto deve conter uma referência a System.Core.dll e um using diretriz para System.Linq. LINQ to SQL, LINQ to XML e LINQ to DataSet tipos requerem adicionais using diretivas e referências. Para obter mais informações, consulte Como criar um projeto LINQ.
Consulte também
Referência
Cláusula where (Referência de C#)