Partager via


Comment : spécifier dynamiquement des filtres de prédicat au moment de l'exécution (Guide de programmation C#)

Mise à jour : novembre 2007

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, comme indiqué dans l'exemple suivant :

Exemple

// To run this sample, first specify some integer values for the command line.
// The numbers 111 through 122 are all valid student IDs.
// In Visual Studio or C# Express, click on Project > Properties > Debug.
// Call the method: QueryByID(args);
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);
    }
}
/* 
 Output (depends on args):
   111 114 118

   Garcia: 114
   Garcia: 118
   Omelchenko: 111
*/

Lorsque vous devez choisir entre diverses requêtes prédéterminées, vous pouvez utiliser une instruction switch. Dans l'exemple suivant, studentQuery a une clause where différente selon le niveau de notes (ou l'année) spécifié sur la ligne de commande.

// 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. In Visual Studio or C# Express, click on Project > Properties > Debug to specify
// command line arguments.
// 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.FirstYear
                           select student;
            break;
        case GradeLevel.ThirdYear:
            studentQuery = from student in students
                           where student.Year == GradeLevel.FirstYear
                           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);
    }
}

Compilation du code

Ces exemples contiennent des références aux objets définis dans l'exemple d'application dans Comment : interroger une collection d'objets (Guide de programmation C#). Pour compiler et exécuter les exemples, collez-les dans la classe StudentClass de cette application et ajoutez un appel à la méthode à partir de la méthode Main.

Lorsque vous adaptez cette méthode à votre propre application, souvenez-vous que LINQ requiert la version 3.5 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 utilisations et des références supplémentaires. Pour plus d'informations, consultez Comment : créer un projet LINQ.

L'exemple Requête dynamique, exemple montre une autre approche de la construction de requête dynamique avec LINQ.

Voir aussi

Concepts

Expressions de requête LINQ (Guide de programmation C#)

Référence

where, clause (Référence C#)