Dynamisches Festlegen von Prädikatfiltern zur LaufzeitDynamically specify predicate filters at runtime

In einigen Fällen wissen Sie bis zur Laufzeit nicht, wie viele Prädikate Sie für die Quellelemente in die where-Klausel übernehmen müssen.In some cases you do not know until run time how many predicates you have to apply to source elements in the where clause. Eine Möglichkeit, mehrere Prädikatfilter dynamisch festzulegen, ist die Verwendung der Methode Contains, wie im folgenden Beispiel gezeigt wird.One way to dynamically specify multiple predicate filters is to use the Contains method, as shown in the following example. Das Beispiel wird auf zwei Arten erstellt.The example is constructed in two ways. Zuerst wird das Projekt durch Filtern nach Werten, die im Programm bereitgestellt werden, ausgeführt.First, the project is run by filtering on values that are provided in the program. Und dann wird das Projekt mithilfe der Eingabe, die zur Laufzeit bereitgestellt wird, erneut ausgeführt.Then the project is run again by using input provided at run time.

Filtern mithilfe der Contains-MethodeTo filter by using the Contains method

  1. Erstellen Sie eine neue Konsolenanwendung und nennen Sie sie PredicateFilters.Open a new console application and name it PredicateFilters.

  2. Kopieren Sie die StudentClass-Klasse aus Query a collection of objects (Abfragen einer Auflistung von Objekten) und fügen Sie ihn in Namespace PredicateFilters unter Klasse Program ein.Copy the StudentClass class from Query a collection of objects and paste it into namespace PredicateFilters underneath class Program. StudentClass stellt eine Liste von Student-Objekten bereit.StudentClass provides a list of Student objects.

  3. Kommentieren Sie die Main-Methode in StudentClass aus.Comment out the Main method in StudentClass.

  4. Ersetzen Sie die Program-Klasse durch den folgenden Code.Replace class Program with the following code.

    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. Fügen Sie die folgende Zeile in die Main-Methode in Klasse DynamicPredicates unter der Deklaration von ids ein.Add the following line to the Main method in class DynamicPredicates, under the declaration of ids.

    QueryById(ids);
    
  6. Führen Sie das Projekt aus.Run the project.

  7. In einem Konsolenfenster wird die folgende Ausgabe angezeigt werden:The following output is displayed in a console window:

    Garcia: 114Garcia: 114

    O'Donnell: 112O'Donnell: 112

    Omelchenko: 111Omelchenko: 111

  8. Im nächsten Schritt wird das Projekt erneut ausgeführt, dieses Mal mit der Eingabe zur Laufzeit anstelle von Array ids.The next step is to run the project again, this time by using input entered at run time instead of array ids. Ändern Sie QueryByID(ids) zu QueryByID(args) in der Main-Methode.Change QueryByID(ids) to QueryByID(args) in the Main method.

  9. Führen Sie das Projekt mit den Befehlszeilenargumenten 122 117 120 115 aus.Run the project with the command line arguments 122 117 120 115. Wenn das Projekt ausgeführt wird, werden diese Werte Elemente von args, dem Parameter der Main-Methode.When the project is run, those values become elements of args, the parameter of the Main method..

  10. In einem Konsolenfenster wird die folgende Ausgabe angezeigt werden:The following output is displayed in a console window:

    Adams: 120Adams: 120

    Feng: 117Feng: 117

    Garcia: 115Garcia: 115

    Tucker: 122Tucker: 122

Filtern mithilfe einer Switch-AnweisungTo filter by using a switch statement

  1. Sie können eine switch-Anweisung zum Auswählen zwischen vordefinierten alternativen Abfragen verwenden.You can use a switch statement to select among predetermined alternative queries. Im folgenden Beispiel verwendet studentQuery eine andere where-Klausel, abhängig davon, welche Klassenstufe oder welches Jahr zur Laufzeit angegeben wird.In the following example, studentQuery uses a different where clause depending on which grade level, or year, is specified at run time.

  2. Kopieren Sie die folgende Methode, und fügen Sie sie in die Klasse DynamicPredicates ein.Copy the following method and paste it into class 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. Ersetzen Sie in der Main-Methode den Aufruf von QueryByID mit dem folgenden Aufruf, der das erste Element aus dem args-Array als sein Argument sendet: QueryByYear(args[0]).In the Main method, replace the call to QueryByID with the following call, which sends the first element from the args array as its argument: QueryByYear(args[0]).

  4. Führen Sie das Projekt mit einem Befehlszeilenargument für einen ganzzahligen Wert zwischen 1 und 4 aus.Run the project with a command line argument of an integer value between 1 and 4.

Siehe auchSee Also

LINQ-AbfrageausdrückeLINQ Query Expressions
where-Klauselwhere clause