Compartilhar via


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

  1. Abra um novo aplicativo de console em Visual Studio. Name it PredicateFilters.

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

  3. Comente a 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 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.

  9. Clique na guia Debug.

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

  11. Change QueryByID(ids) to QueryByID(args) in the Main method.

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

  2. 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);
        }
    }
    
  3. 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.

  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ê 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#)

Conceitos

Expressões de consulta LINQ (Guia de Programação em C#)