Parte della mia applicazione utilizza i nomi delle strade che sono memorizzati in un database SQL. L'applicazione accederà ad ogni record di nome almeno una volta e la maggior parte sarà accessibile più volte. Così ho deciso di caricare i dati dei nomi in un dizionario e quindi cercare di ridurre le letture del database.Perché la ricerca del dizionario fornisce un errore di timeout SQL?
La tabella dei nomi delle strade ha circa 3 milioni di record e io uso il seguente Linq-to-SQL per caricarlo in memoria;
Dictionary<String, DbRoadName> roadNames;
using (RoutingDataContext dc = new RoutingDataContext(connectionString))
{
roadNames = dc.DbRoadNames.ToDictionary(x => x.RoadId);
}
Esegue come previsto. L'interruzione del codice a questo punto e il passaggio del mouse sulla variabile roadNames in Visual Studio mostra che il dizionario sembra contenere le coppie chiave-valore previste.
Tuttavia, quando arrivo alla seguente riga più avanti nel programma
DbRoadName roadName = roadNames[lookupId];
il programma si ferma con la seguente eccezione
.Net SqlClient Data Provider: Timeout scaduto.
Da quanto ho capito, il metodo ToDictionary()
dovrebbe causare la query di database per eseguire, a quel punto, quindi perché mi appare un errore di timeout di SQL alla consultazione dei dizionari?
Aggiornamento: I 'fixed' il problema sostituendo
DbRoadName roadName = roadNames[lookupId];
con una dichiarazione TryGetValue. Tuttavia, sono ancora interessato al motivo per cui il dizionario in memoria stava producendo un'eccezione SQL.
I dettagli di tutte le eccezioni (o qualcosa di più del messaggio almeno) potrebbero aiutare – MatteoSp
Wow inserire un nome di roadCountry subito dopo l'utilizzo. La mia ipotesi è un'esecuzione differita. – Paparazzi
@Blam l'ho fatto. Il conteggio mostra il valore corretto ma l'eccezione si verifica ancora nella ricerca. –