Procedura: specificare dinamicamente i filtri dei predicati in fase di esecuzione (Guida per programmatori C#)
Aggiornamento: novembre 2007
In alcuni casi non è possibile sapere quanti predicati sia necessario applicare agli elementi di origine nella clausola where fino alla fase di esecuzione. Per specificare in modo dinamico più filtri dei predicati, è possibile utilizzare il metodo Contains, come illustrato nell'esempio seguente:
Esempio
// 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
*/
Quando è necessario scegliere tra query alternative predeterminate, è possibile utilizzare un'istruzione switch. Nell'esempio seguente, studentQuery ha una clausola where diversa in base alla classe o all'anno specificato sulla riga di comando.
// 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);
}
}
Compilazione del codice
In questi esempi sono contenuti riferimenti a oggetti definiti nell'applicazione di esempio in Procedura: eseguire una query su un insieme di oggetti (Guida per programmatori C#). Per compilare ed eseguire gli esempi, incollarli nella classe StudentClass in tale applicazione e aggiungere una chiamata al metodo dal metodo Main.
Quando si adatta questo metodo alla propria applicazione, ricordare che LINQ richiede la versione 3.5 di .NET Framework e che il progetto deve contenere un riferimento a System.Core.dll e una direttiva using per System.Linq. I tipi LINQ to SQL, LINQ to XML e LINQ to DataSet richiedono direttive using e riferimenti aggiuntivi. Per ulteriori informazioni, vedere la classe Procedura: creare un progetto LINQ.
L'esempio Esempio Dynamic Query mostra un altro approccio alla costruzione di query dinamiche con LINQ.
Vedere anche
Concetti
Espressioni query LINQ (Guida per programmatori C#)