Originariamente inviata da
Veronica80
Allora io sto usando questo metodo [...]
Come sospettavo, stai ripetendo l'interrogazione al DB ogni volta che il valore della casella di testo cambia, quindi è normale notarlo (anche se l'operazione può essere relativamente veloce).
Quello che sarebbe invece più opportuno è eseguirla una volta sola, e poi filtrare magari sui risultati già acquisiti, sempre se non sono troppi.
Andando per gradi, quando costruisci una espressione LINQ che si basa sul DbContext di Entity Framework, nel nostro caso ipotizzo sia la variabile efTotDb, di fatto stai costruendo una struttura che rappresenta una interrogazione che verrà affidata a EF, ovvero convertita successivamente in SQL ed eseguita, memorizzando poi i valori dei record recuperati all'interno di oggetti. Questo avviene solo chiamando un metodo che lancia l'esecuzione dell'espressione, come ad esempio ToList.
La prima parte del tuo codice fa proprio questo:
codice:
Dim qry = From o In mioEf.dgv_ospiti
Where o.cognome_Osp.StartsWith(TextBox1.Text)
Select o
Dim lista As List(Of dgv_ospiti) = qry.ToList()
Io invece toglierei il filtro dall'espressione sopra, in modo che vengano recuperati tutti i dati, o alla peggio applicando un altro filtro che limiti il resultset ma non in base al valore inserito nella casella.
Questo caricamento lo farei una volta sola all'apertura della finestra, o comunque inizialmente e a seguito di un comando di refresh forzato. Poi andrei ad applicare il filtro su quei risultati, magari usando sempre LINQ.
Per spiegarmi, da qualche parte (es. Form_Load) metterei il caricamento fatto circa così:
codice:
Dim listaOspiti = mioEf.dgv_ospiti.ToList()
In questo modo, recuperiamo tutte le entità da Entity Framework.
Quando il testo della casella cambia, lo gestirei così:
codice:
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
Dim lista As List(Of dgv_ospiti)
lista = From o In listaOspiti
Where o.cognome_Osp.StartsWith(TextBox1.Text)
Select o
dgvOsp.Rows.Clear()
For Each ospite As dgv_ospiti In lista
dim imgSex as bitmap=my.resources.maschio
if ospite.sesso_Osp=true then
imgSex=my.resources.femmina
end if
dgvOsp.Rows.Add(ospite.id_Osp, ospite.sesso_Osp, imgSex, ospite.cognome_Osp, ospite.nome_Osp, ospite.cf_Osp, ospite.indirizzo_Osp, ospite.com_Res, ospite.prov_Res, ospite.dataNascita_Osp, ospite.com_Nas, ospite.com_Res)
Next
End Sub
In breve, applicherei il filtro sempre e solo a oggetti caricati precedentemente in memoria e veloci da filtrare, senza eseguire di nuovo la query.
La sintassi LINQ è la stessa, poiché non dipende dall'ambito, ma in questo caso viene usata per costruire una espressione basata su oggetti e non una query SQL per interrogare dei dati.
Ciao!