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

  1. Aprire una nuova applicazione console in Visual Studio. Denominarla PredicateFilters.

  2. 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.

  3. Impostare come commento il metodo Main in StudentClass.

  4. 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);
            }
        }
    }
    
  5. Aggiungere la riga seguente al metodo Main nella classe DynamicPredicates, sotto la dichiarazione di ids.

    QueryById(ids);
    
  6. Premere F5 per eseguire il progetto.

  7. In una finestra del prompt dei comandi verrà visualizzato il seguente output:

    Garcia: 114

    O'Donnell: 112

    Omelchenko: 111

  8. 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à.

  9. Fare clic sulla scheda Debug.

  10. 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.

  11. Modificare QueryByID(ids) con QueryByID(args) nel metodo Main.

  12. Premere F5 per eseguire il progetto.

  13. 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

  1. È 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.

  2. 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);
        }
    }
    
  3. Nella finestra Argomenti della riga di comando sostituire i numeri di ID della procedura precedente con un valore intero compreso tra 1 e 4.

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

  5. 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#)

Concetti

Espressioni di query LINQ (Guida per programmatori C#)