La soluzione è più semplice del previsto: quando usi una espressione LINQ, stai creando un oggetto che rappresenta i risultati che vuoi estrarre da un insieme di dati, a cui puoi applicare filtri, ordinamenti, proiezioni, ecc.
Nel tuo esempio quindi, la variabile che hai chiamato lista è fuorviante: non contiene i risultati che ti aspetti, ma rappresenta la "query" per ottenerli, definita tramite la sintassi LINQ e i metodi di estensione che mette a disposizione per le generiche "collezioni".
Fino a quando non esegui un ciclo For, oppure non chiami ToList(), ToArray(), First(), Last() e così via, quell'oggetto rimane semplicemente una espressione, mentre coi suddetti metodi essa viene eseguita e produce i risultati richiesti; nel caso di Entity Framework, quell'espressione viene valutata e convertita in SQL (tienilo presente perché non puoi usare operatori o metodi che non sono convertibili in SQL), lanciata sul DB e poi convertita nel risultato richiesto, ovvero l'oggetto che rappresenta l'entità.
Detto questo, puoi costruire la tua query passo per passo aggiungendo di volta in volta nuove condizioni e clausole, e lanciarla una volta sola alla fine.
Riprendendo il tuo esempio, puoi fare qualcosa del genere (non l'ho compilato):
Se vuoi approfondire la cosa, ti segnalo anche questo mio articolo su HTML.it che parla della Deferred Execution di LINQ.codice:' Prendo tutti i comuni disponibili Dim query = From comune In mioEf.dgv_comuni ' Aggiungo il filtro se necessario If idRegione <> 0 Then query = From comune In query Where comune.idReg= idRegione Select comune End If ' Aggiungo eventuali altri filtri alla query ' ... ' Eseguo finalmente la query e ottengo i risultati Dim lista = query.ToList()
Prima di partire, assicurati di comprendere bene il funzionamento di LINQ: a mio avviso ha dei benefici spesso poco compresi e sfruttati male, ma è uno degli strumenti più validi a disposizione nei linguaggi .NET.
Suggerisco anche di scaricare il tool LINQPad che ti permette di sperimentare (anche con Entity Framework) e di testare le espressioni (in C# e VB.NET); alla fine potrai copiare e incollare le espressioni nel tuo programma e vederle funzionare, senza dover apportare cambiamenti.
Ciao!![]()