2013-10-19 14 views
7

Wenn ich eine Abfrage in Dapper ausführen und nur einen Block von Datensätzen abrufen möchte, kann ich .Skip() verwenden. Take(), oder brauche ich verwenden Sie wählen Top N * in der SQL?Hat Dappers IEnumerable <T> verzögerte oder sofortige Ausführung?

zB Bei einer Tabelle mit 10.000 Datensätzen und ich möchte nur die ersten 200, weil meine Liste Seite nur 200 pro Seite zeigt. Leite ich das?

conn.Query<Widget>("select * from Widgets").Skip((page - 1) * size).Take(size); 

Oder diese:

conn.Query<Widget>("select top 200 * from Widgets"); 

Ist Dapper der .Query<T> Methode abgegrenzt oder nicht?

Antwort

8

Sie sollten SELECT TOP n... verwenden.

Die Query<T>-Methode verfügt über den optionalen Parameter bool buffered = true, der bei True den gesamten Ergebnissatz durchläuft und jede Zeile in eine List<T> liest. Sie könnten diesen Parameter auf false setzen, und die resultierende IEnumerable<T> würde in dem Sinne "zurückgestellt" werden, dass die DB-Abfrage nicht ausgeführt würde, bis Sie sie verwenden und die Zeilen "einzeln" von der DB-Seite abgerufen werden (Aufrufe) IDataReader.Read bei jeder Iteration).

Also, ja, es kann "aufgeschoben" werden. JEDOCH sollten Sie trotzdem TOP n verwenden, da Sie andernfalls das Resultset für 10000 Datensätze auf der db-Seite ausführen und vorbereiten würden, obwohl Sie nur die ersten n Zeilen davon auf den Client übertragen können.