Procedura: specificare dinamicamente i filtri dei predicati in fase di esecuzione (Guida per programmatori C#)
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. L'esempio viene costruito in due modi. Prima, il progetto viene eseguito filtrando i valori forniti nel programma. Quindi il progetto viene nuovamente eseguito utilizzando l'input fornito in fase di esecuzione.
Per eseguire il filtraggio utilizzando il metodo Contains
Aprire una nuova applicazione console in Visual Studio. Denominarla PredicateFilters.
Copiare la classe StudentClass da Procedura: eseguire una query su un insieme di oggetti (Guida per programmatori C#) e incollarla nello spazio dei nomi PredicateFilters sotto la classe Program. StudentClass fornisce un elenco di oggetti Student.
Impostare come commento il metodo Main in StudentClass.
Sostituire la classe Program con il codice seguente.
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("{0}: {1}", name.LastName, name.ID); } } }
Aggiungere la riga seguente al metodo Main nella classe DynamicPredicates, sotto la dichiarazione di ids.
QueryById(ids);
Premere F5 per eseguire il progetto.
In una finestra del prompt dei comandi verrà visualizzato il seguente output:
Garcia: 114
O'Donnell: 112
Omelchenko: 111
Il passaggio successivo consiste nell'eseguire nuovamente il progetto, questa volta utilizzando l'input immesso in fase di esecuzione anziché la matrice ids. In Esplora soluzioni fare clic con il pulsante destro del mouse su PredicateFilters, quindi scegliere Proprietà.
Fare clic sulla scheda Debug.
Nella finestra Argomenti della riga di comando digitare 122, 117, 120 e 115 separati da spazi: 122 117 120 115. Quando il progetto viene eseguito, tali valori diventano elementi di args, il parametro del metodo Main.
Modificare QueryByID(ids) con QueryByID(args) nel metodo Main.
Premere F5 per eseguire il progetto.
In una finestra del prompt dei comandi verrà visualizzato il seguente output:
Adams: 120
Feng: 117
Garcia: 115
Tucker: 122
Per eseguire il filtraggio utilizzando un'istruzione switch
È possibile utilizzare un'istruzione switch per scegliere tra le query alternative predefinite. Nell'esempio seguente, studentQuery utilizza una clausola where diversa a seconda dell'anno scolastico specificato in fase di esecuzione.
Copiare il seguente metodo e incollarlo nella classe 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("{0}: {1}", name.LastName, name.ID); } }
Nella finestra Argomenti della riga di comando sostituire i numeri di ID della procedura precedente con un valore intero compreso tra 1 e 4.
Nel metodo Main sostituire la chiamata a QueryByID con la seguente chiamata, che consente di inviare il primo elemento dalla matrice args come relativo argomento: QueryByYear(args[0]).
Premere F5 per eseguire il progetto.
Per utilizzare questo metodo nelle applicazioni
- Quando si adatta questo metodo a un'applicazione, ricordare che LINQ richiede la versione 3.5 o 4 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 Procedura: creare un progetto LINQ.
Vedere anche
Riferimenti
Clausola where (Riferimento C#)