2011-06-02 17 views
7

ile Çoklu Haritalama: Bu çalışmasına rağmenZarif Aşağıda ben nesnelerin bir sayfalık listesini döndürmek için kullanıyorum kodudur tek dönüş değeri

string query2 = @" 
     select count(*) as TotalCount from blogposts p where p.Deleted = 0 and p.PublishDate <= @date 
     select * from (
      select p.*, 
      row_number() over(order by publishdate desc) as rownum 
      from blogposts as p 
      where p.Deleted = 0 and p.PublishDate <= @date 
     ) seq 
     where seq.rownum between @x and @y"; 

using (var cn = new SqlConnection(connectionString)) 
{ 
    cn.Open(); 
    using (var multi = cn.QueryMultiple(query2, new { x= lower, y = upper, date = DateTime.UtcNow })) 
    { 
     var totalCount = multi.Read<int>().Single(); 
     var posts = multi.Read<PostModel>().ToList(); 
     return new PagedList<PostModel>(posts, page, pageSize, x => totalCount); 
    } 
} 

, o iki kez benim kriterlerini tanımlamak zorunda olduğu anlamına gelir Bir kez sayım sorgusu için ve sonuç kümesi sorgusu için bir kez.

 string query = @" 
       select * from (select p.*, 
       row_number() over(order by publishdate desc) as rownum, 
       count(*) over() as TotalCount 
       from blogposts as p) seq 
       where seq.rownum between @x and @y"; 

Ancak, ben bu kullanarak Dapper eşlemleyebilir görünmüyor: Daha ziyade dize birbirine bağlanmasına yol çare yerine, sadece bir sorgu yürütebilirsiniz. Birden fazla sonuç olmadığı için yukarıdakiyle aynı yöntemi kullanamıyorum. Çok eşlemeyi kullanarak denedim, ancak bu bir IEnumerable döndürmeyi umuyor.

Aşağıdakilerle nasıl eşleşirim?

public class PostList 
    { 
     public IEnumerable<PostModel> Posts; 
     public int TotalCount { get; set; } 
    } 

Teşekkür

Ben

cevap

6

Şey ... ... olmaz

Gerçekten bir TOTALCOUNT özelliği ... içerecek şekilde PostModel değişiklik yapması gerekiyor

çirkin. Ya da bir dinamik yürüt ve çirkin olan bir Select içinde tekrar.

Görüyorsunuz, (*) count(*) over() ile N kere sayılıyorsunuz ... hack, bu hack'in kullanılması daha hızlı değil. Bazı senaryolarımda çift sorgu çalıştırmayı yavaşlattığını ölçtüm, özellikle tüm sütunları seçmediğiniz için select count(*)'daki bazı dizinleri kısaltabilirsiniz. Ek olarak, hack, bazı sayfalama optimizasyonlarını devre dışı bırakır, örneğin sorguya select top N ekleyemezsiniz.

Sayfalama sorguları ile ilgili önerilerim, dizin oluşturmanın doğru olması olacaktır. Mükemmel ölçün ve bu hack gerçekten yardımcı olur (doğru indeksleme yerinde olduğunda).

Dize birleştirme ile ilgili endişeleri takip ediyorum, ancak bunun için genel yardımcı yöntemleri her zaman tanımlayabilirsiniz.

+0

Geri bildirim için teşekkürler. Sanırım ikili sorguyla uğraşacağım ve işleri kuru tutmak için bazı yardımcılar inşa edeceğim. –

İlgili konular