Spécifier dynamiquement des filtres de prédicat au moment de l’exécution

Dans certains cas, ce n’est qu’au moment de l’exécution que vous savez combien de prédicats vous devez appliquer aux éléments source dans la clause where. L’une des manières de spécifier plusieurs filtres de prédicat de manière dynamique consiste à utiliser la méthode Contains, comme indiqué dans l’exemple suivant. L’exemple est construit de deux façons. Tout d’abord, le projet est exécuté en filtrant les valeurs fournies dans le programme. Ensuite, le projet est réexécuté à l’aide de l’entrée fournie au moment de l’exécution.

Pour filtrer à l’aide de la méthode Contains

  1. Ouvrez une nouvelle application console et nommez-la PredicateFilters.

  2. Copiez la classe StudentClass à partir de Interroger une collection d’objets et collez-la dans l’espace de noms PredicateFilters sous la classe Program. StudentClass fournit une liste d’objets Student.

  3. Commentez la méthode Main dans StudentClass.

  4. Remplacez la classe Program par le code suivant.

    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($"{name.LastName}: {name.ID}");
            }
        }
    }
    
  5. Ajoutez la ligne suivante à la méthode Main dans la classe DynamicPredicates, sous la déclaration de ids.

    QueryById(ids);
    
  6. Exécutez le projet.

  7. La sortie suivante s’affiche dans une fenêtre de console :

    Garcia: 114

    O’Donnell: 112

    Omelchenko: 111

  8. L’étape suivante consiste à réexécuter le projet, cette fois en utilisant l’entrée saisie au moment de l’exécution plutôt que le tableau ids. Remplacez QueryByID(ids) par QueryByID(args) dans la méthode Main.

  9. Exécutez le projet avec les arguments de ligne de commande 122 117 120 115. Quand le projet est exécuté, ces valeurs deviennent des éléments de args, le paramètre de la méthode Main.

  10. La sortie suivante s’affiche dans une fenêtre de console :

    Adams: 120

    Feng: 117

    Garcia: 115

    Tucker: 122

Pour filtrer à l’aide d’une instruction switch

  1. Vous pouvez utiliser une instruction switch pour sélectionner parmi d’autres requêtes prédéterminées. Dans l’exemple suivant, studentQuery utilise une autre clause where en fonction du niveau, ou de l’année, spécifié(e) au moment de l’exécution.

  2. Copiez la méthode suivante et collez-la dans la 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($"{name.LastName}: {name.ID}");
        }
    }
    
  3. Dans la méthode Main, remplacez l’appel à QueryByID par l’appel suivant, qui envoie le premier élément du tableau args comme argument : QueryByYear(args[0]).

  4. Exécutez le projet avec un argument de ligne de commande d’une valeur entière comprise entre 1 et 4.

Voir aussi

Expressions de requête LINQ
where, clause