How to: Especificar dinamicamente o filtros de predicado em tempo de execução (guia de programação de 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 maneira de especificar dinamicamente os vários filtros de predicado é usar o Contains método, conforme mostrado no exemplo a seguir. O exemplo é construído de duas maneiras. Primeiro, o projeto é executado pela filtragem de 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. O nome PredicateFilters.
Cópia de StudentClass classe a partir de How to: Consultar uma coleção de objetos (guia de programação de C#) e colá-lo no namespace PredicateFilters sob a classe Program. StudentClassFornece uma lista de Student objetos.
Comente o 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 inserida 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, digite 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 de Main método.
Alterar QueryByID(ids) para QueryByID(args) na Main método.
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 instrução para selecionar entre consultas alternativas predeterminado. No exemplo a seguir, studentQuery usa um diferente where cláusula dependendo de qual nível de graduação ou ano, é especificado em tempo de execução.
O seguinte método de copiar e colar a 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 o ID 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ê pode adaptar esse método para o seu próprio aplicativo, lembre-se de que o LINQ requer a versão 3.5 ou 4 do .NET Framework, e que o projeto deve conter uma referência a System.Core.dll e um using diretiva 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
onde a cláusula (referência de C#)