Schnellster Weg, um einen einzigen Datensatz mit SubSonic zu erhalten

Ich bin neu bei SubSonic und Linq Stuff und versuche herauszufinden, wie man einen einzigen Datensatz am kürzesten und optimalen Weg abrufen kann.

Was ist auf andere Weise schneller und erfordert weniger Code zu schreiben als dieser, um einen einzelnen Datensatz zu erhalten?

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

Ich habe antsProfiler Tool verwendet, um zu überprüfen, und dies dauert avg von 29.12ms CPU-Zeit - getestet über zehn Läuft

Wo, da dies dauert noch länger

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>();

Nur die letzte Zeile dauert 256.08ms CPU-Zeit plus UserController dauert 66,86ms.

Irgendwelche Vorschläge?

Antwort auf "Schnellster Weg, um einen einzigen Datensatz mit SubSonic zu erhalten " 3 von antworten

Der "Flaschenhals" wäre die generierte Abfrage, die ausgeführt wird, nicht SubSonic, die sie generiert oder das Ergebnis zurückgibt. Wenn eine bestimmte Abfrage langsam ist, sollten Sie die Indizierungsfunktionen Ihres Datenbankanbieters verwenden, um sie zu optimieren.

Im zweiten Fall gehe ich davon aus, dass die zusätzliche Ausführungszeit für LINQ der Aufwand ist, um das erste Element aus der Auflistung zurückzugeben.

Also meine Antwort wäre, der erste Weg ist der beste Weg, es zu tun, und wenn 29ms nicht akzeptabel ist (was für einen Anruf an eine DB, ich denke nicht, dass es unangemessen ist), fügen Sie einige Indizes in Ihrer DB hinzu, um den Abruf zu beschleunigen.

Ich denke, dass John mit dem Geld recht hat. Wenn Sie SubSonic wirklich testen möchten, um zu sehen, wie viel Zeit es dauert, zu testen, wie lange es dauert, die SQL-Anweisung zu erstellen, nicht wie lange SubSonic benötigt, um die SQL-Anweisung zu erstellen, und wie lange Es dauert, bis Ihre DB die Ergebnisse gleichzeitig zurückgibt (Sie müssen Ihre Tests isolieren).

Vielleicht sollten Sie testen, wie lange es dauert, um die Ergebnisse mit einem regulären alten SQLCommand zu erhalten und es Ihre Verbindung und Parameter zu übergeben und zu sehen, wie lange das dauert, damit Sie einen Vergleich haben.

IIRC ist das Query-Objekt fließend. Dh.

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

Sollte wie lauten:

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

Die erhöhte Zeit in Ihren Tests kann aus diesem Grund berücksichtigt werden (Sie fragen nach allen User-Elementen und greifen dann die Erste).