Share via


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

  1. Abra um novo aplicativo de console em Visual Studio. O nome PredicateFilters.

  2. 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.

  3. Comente o Main método na StudentClass.

  4. 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);
            }
        }
    }
    
  5. Adicione a seguinte linha para o Main método na classe DynamicPredicates, sob a declaração de ids.

    QueryById(ids);
    
  6. Pressione F5 para executar o projeto.

  7. A seguinte saída é exibida em uma janela de Prompt de comando:

    Garcia: 114

    O ' Donnell: 112

    Omelchenko: 111

  8. 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.

  9. Clique na guia Debug.

  10. 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.

  11. Alterar QueryByID(ids) para QueryByID(args) na Main método.

  12. Pressione F5 para executar o projeto.

  13. 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

  1. 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.

  2. 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);
        }
    }
    
  3. No argumentos de linha de comando janela, números de substituir o ID do procedimento anterior com um valor inteiro entre 1 e 4.

  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]).

  5. 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#)

Conceitos

LINQ Expressões de consulta (guia de programação de C#)