Dynamisches Festlegen von Prädikatfiltern zur Laufzeit

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. Eine Möglichkeit, mehrere Prädikatfilter dynamisch festzulegen ist die Verwendung der Methode Contains, wie im folgenden Beispiel gezeigt. Das Beispiel wird auf zwei Arten erstellt. Zuerst wird das Projekt durch Filtern nach Werten, die im Programm bereitgestellt werden, ausgeführt. Und dann wird das Projekt mithilfe der Eingabe, die zur Laufzeit bereitgestellt wird, erneut ausgeführt.

Filtern mithilfe der Contains-Methode

  1. Erstellen Sie eine neue Konsolenanwendung und nennen Sie sie 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. StudentClass stellt eine Liste von Student-Objekten bereit.

  3. Kommentieren Sie die Main-Methode in StudentClass aus.

  4. Ersetzen Sie die Program-Klasse durch den folgenden 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.

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

  7. In einem Konsolenfenster wird die folgende Ausgabe angezeigt werden:

    Garcia: 114

    O'Donnell: 112

    Omelchenko: 111

  8. Im nächsten Schritt wird das Projekt erneut ausgeführt, dieses Mal mit der Eingabe zur Laufzeit anstelle von Array ids. Ändern Sie QueryByID(ids) zu QueryByID(args) in der Main-Methode.

  9. Führen Sie das Projekt mit den Befehlszeilenargumenten 122 117 120 115 aus. Wenn das Projekt ausgeführt wird, werden diese Werte Elemente von args, dem Parameter der Main-Methode.

  10. In einem Konsolenfenster wird die folgende Ausgabe angezeigt werden:

    Adams: 120

    Feng: 117

    Garcia: 115

    Tucker: 122

Filtern mithilfe einer Switch-Anweisung

  1. Sie können eine switch-Anweisung zum Auswählen zwischen vordefinierten alternativen Abfragen verwenden. Im folgenden Beispiel verwendet studentQuery eine andere where-Klausel, abhängig davon, welche Klassenstufe oder welches Jahr zur Laufzeit angegeben wird.

  2. Kopieren Sie die folgende Methode, und fügen Sie sie in die Klasse DynamicPredicates ein.

    // 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]).

  4. Führen Sie das Projekt mit einem Befehlszeilenargument für einen ganzzahligen Wert zwischen 1 und 4 aus.

Siehe auch

LINQ-Abfrageausdrücke
where-Klausel