2013-10-19 18 views
7

Dapper'da bir sorgu çalıştırdığımda ve yalnızca bir kayıt bloğu almak istediğimde, .Skip(). Take() kullanabilir miyim veya SQL'de en iyi n * seçeneğini kullanmam gerekebilir mi?Dapper'ın IEnumerable <T> mu ertelenmiş veya anında yürütülür?

Örneðin, 10.000 kayýt içeren bir tablo verildiðinden, ilk 200 sayfasýný istiyorum çünkü liste sayfam yalnýzca sayfa başına 200 gösteriyor. Bunu ben mi çalıştırıyorum?

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

Ya da bu:

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

Dapper en .Query<T> yöntem ertelenmiş mu değil mi?

cevap

8

SELECT TOP n... kullanmalısınız.

Query<T> yönteminin, bool buffered = true isteğe bağlı bir parametresi vardır; bu, tam sonuçlar kümesinde doğru döngü yaparken her satırı List<T> olarak okur. Bu parametreyi yanlış yapabilirdiniz ve ortaya çıkan IEnumerable<T>, db sorgusunu kullanana kadar db sorgusunun yürütülmeyeceği anlamında "ertelenebilir" olur ve satırlar "her seferinde bir kerede" db tarafından alınabilir. Her iterasyonda IDataReader.Read).

Evet, "ertelenmiş" olabilir. Şimdilik, TOP n'u kullanmaya devam etmelisiniz, aksi halde, yalnızca ilk n satırını istemciye taşıyabiliyor olsanız bile, db tarafında 10000 kayıtları için sonuç kümesini çalıştırır ve hazırlarsınız.