Domanda

Sono nuovo di SubSonic e Linq Stuff e sto provando a capire il modo più breve e ottimale per recuperare un singolo record.

Quale altro modo è più veloce e richiede meno codice per scrivere di questo per ottenere un singolo record?

User user2 = DB.Select().From(User.Schema)
.Where(User.PasswordColumn).IsEqualTo(password)
.And(User.SINumberColumn).IsEqualTo(siNumber)
.ExecuteSingle<User>();

Ho usato lo strumento AntsProfiler per verificare, e ciò richiede una media di 29,12 ms di tempo della CPU - testato su dieci esecuzioni

Dove ciò richiede ancora più tempo

UserController uc = new UserController();
Query query = new Query("User");
query.WHERE(User.Columns.Password, password);
query.WHERE(User.Columns.SINumber, siNumber);   
User user = uc.FetchByQuery(query).First<User>();

Solo l'ultima riga richiede 256.08ms di tempo CPU più UserController richiede 66.86ms.

Qualche suggerimento?

È stato utile?

Soluzione

IIRC, l'oggetto Query è fluente .. cioè

query.WHERE(User.Columns.Password, password);
query.WHERE(User.Columns.SINumber, siNumber);

Dovrebbe essere letto come:

query = query.WHERE(User.Columns.Password, password);
query = query.WHERE(User.Columns.SINumber, siNumber);

Il tempo maggiore nei test potrebbe essere considerato per questo motivo (stai chiedendo tutti gli oggetti utente e poi afferrando il primo).

Altri suggerimenti

Il "collo di bottiglia" sarebbe l'esecuzione della query generata, non SubSonic che la genera o restituisce il risultato. Se una determinata query è lenta, è necessario esaminare le funzioni di indicizzazione del proprio provider di database per ottimizzarlo.

Nel secondo caso, suppongo che il tempo di esecuzione aggiuntivo sia sovraccarico per LINQ per restituire il primo elemento dalla raccolta.

Quindi la mia risposta sarebbe, il primo modo è il modo migliore per farlo, e se 29ms non è accettabile (che per una chiamata a un DB, non credo sia irragionevole), aggiungi alcuni indici nel tuo DB per accelerare il recupero.

Penso che John abbia ragione sui soldi. Se vuoi davvero provare SubSonic per vedere quanto tempo ci vuole, devi provare quanto tempo impiega subsonic per creare l'istruzione SQL e non quanto tempo impiega SubSonic per creare l'istruzione SQL e quanto tempo impiega il tuo DB a restituire i risultati allo stesso tempo (è necessario isolare i test).

Forse dovresti testare quanto tempo ci vuole per ottenere i risultati con un vecchio SQLCommand regolare e passargli la tua connessione e parametri e vedere quanto tempo ci vuole per avere un confronto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top