Compartilhar via


Como: especificar dinamicamente o predicado filtros em tempo de execução (guia de programação do 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 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: consulta uma coleção de objetos (guia de programação do 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

onde a cláusula (referência de C#)

Conceitos

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