Gewusst wie: Dynamisches Festlegen von Prädikatfiltern zur Laufzeit (C#-Programmierhandbuch)
Aktualisiert: November 2007
In einigen Fällen wissen Sie bis zur Laufzeit nicht, wie viele Prädikate Sie auf Quellelemente in der where-Klausel anwenden müssen. Sie können mehrere Prädikatfilter dynamisch festlegen, indem Sie beispielsweise die Contains-Methode verwenden, wie im folgenden Beispiel gezeigt:
Beispiel
// 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
*/
Wenn Sie zwischen zuvor festgelegten Alternativabfragen auswählen müssen, können Sie eine switch-Anweisung verwenden. Im folgenden Beispiel enthält studentQuery eine andere where-Klausel, je nach Jahrgangsstufe oder Jahr, die in der Befehlszeile angegeben ist.
// 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);
}
}
Kompilieren des Codes
Diese Beispiele enthalten Verweise auf Objekte, die in der Beispielanwendung in Gewusst wie: Abfragen einer Auflistung von Objekten (C#-Programmierhandbuch) definiert werden. Um diese Beispiele zu kompilieren und auszuführen, fügen Sie sie in die StudentClass-Klasse dieser Anwendung ein, und fügen Sie ihr von der Main-Methode einen Aufruf hinzu.
Wenn Sie diese Methode an Ihre eigene Anwendung anpassen, beachten Sie, dass LINQ .NET Framework Version 3.5 benötigt und dass das Projekt einen Verweis auf System.Core.dll enthalten und eine Direktive für System.Linq verwenden muss. LINQ-to-SQL-, LINQ-to-XML- und LINQ-to-DataSet-Typen erfordern zusätzliche Usings und Verweise. Weitere Informationen hierzu finden Sie unter Gewusst wie: Erstellen eines LINQ-Projekts.
Im Beispiel Beispiel zur dynamischen Abfrage wird ein anderer Ansatz zur dynamischen Abfragekonstruktion mit LINQ dargestellt.
Siehe auch
Konzepte
LINQ-Abfrageausdrücke (C#-Programmierhandbuch)