Comment : spécifier dynamiquement des filtres de prédicat au moment de l'exécution (Guide de programmation C#)
Dans certains cas vous ne savez pas, jusqu'à l'exécution, combien de prédicats vous devez appliquer aux éléments source dans la clause where. Une façon de spécifier plusieurs filtres de prédicat de manière dynamique est d'utiliser la méthode Contains``1, comme indiqué dans l'exemple suivant. L'exemple est construit de deux façons. En premier lieu, le projet est exécuté en filtrant sur les valeurs fournies dans le programme. Le projet est ensuite à nouveau exécuté à l'aide de l'entrée fourni au moment de l'exécution.
Pour filtrer à l'aide de la méthode Contains
Ouvrez un projet d'application console dans Visual Studio. Nommez-le PredicateFilters.
Copiez la classe StudentClass à partir de Comment : interroger une collection d'objets (Guide de programmation C#) et collez-la dans PredicateFilters l'espace de noms sous la classe Program. StudentClass fournit une liste d'objets Student.
Commentez la méthode Main dans StudentClass.
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("{0}: {1}", name.LastName, name.ID); } } }
Ajoutez la ligne suivante à la méthode Main dans la classe DynamicPredicates, sous la déclaration d'ids.
QueryById(ids);
Appuyez sur F5 pour exécuter le projet.
La sortie suivante est affichée dans une fenêtre d'invite de commandes :
Garcia: 114
O'Donnell: 112
Omelchenko: 111
L'étape suivante consiste à exécuter à nouveau le projet, en utilisant cette fois l'entrée datant du moment de l'exécution au lieu du tableau ids. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur PredicateFilters, puis cliquez sur Propriétés.
Cliquez sur l'onglet Débogage.
Dans la fenêtre Arguments de la ligne de commande, tapez 122, 117, 120 et 115, séparés par des espaces : 122 117 120 115. Lorsque le projet est exécuté, ces valeurs deviennent des éléments d'args, le paramètre de la méthode Main.
Remplacez QueryByID(ids) par QueryByID(args) dans la méthode Main.
Appuyez sur F5 pour exécuter le projet.
La sortie suivante est affichée dans une fenêtre d'invite de commandes :
Adams: 120
Feng: 117
Garcia: 115
Tucker: 122
Pour filtrer à l'aide d'une instruction switch
Vous pouvez utiliser une instruction switch pour effectuer une sélection parmi d'autres requêtes prédéterminées. Dans l'exemple suivant, studentQuery utilise une clause where différente selon le niveau ou l'année, spécifiée au moment de l'exécution.
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("{0}: {1}", name.LastName, name.ID); } }
Dans la fenêtre Arguments de la ligne de commande, remplacez les numéros d'ID de la procédure précédente par une valeur entière comprise entre 1 et 4.
Dans la méthode Main, remplacez l'appel à QueryByID par l'appel suivant, qui envoie le premier élément à partir du tableau args en tant que son argument : QueryByYear(args[0]).
Appuyez sur F5 pour exécuter le projet.
Pour utiliser cette méthode dans vos propres applications
- Lorsque vous adaptez cette méthode à votre propre application, souvenez-vous que LINQ requiert la version 3.5 ou 4 du .NET Framework et que le projet doit contenir une référence à System.Core.dll et une directive using pour System.Linq. Les types LINQ to SQL, LINQ to XML et LINQ to DataSet requièrent des directives et des références using supplémentaires. Pour plus d'informations, consultez Comment : créer un projet LINQ.