2011-06-02 15 views
7

के साथ बहु मानचित्रण नीचे कोड मैं वस्तुओं की एक पृष्ठांकित सूची वापस जाने के लिए उपयोग कर रहा हूँ है:डैप्पर - एक ही वापसी मान

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

हालांकि यह काम करता है, तो इसका मतलब है कि मैं अपने मापदंड दो बार परिभाषित करने के लिए है, एक बार गिनती क्वेरी के लिए और एक बार परिणाम क्वेरी के लिए।

 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"; 

हालांकि, मैं इस डैप्पर का उपयोग कर मैप करने के लिए सक्षम नहीं है: बल्कि स्ट्रिंग संयोजन करने के लिए सहारा की तुलना में, मैं सिर्फ एक क्वेरी निष्पादित कर सकते हैं। मैं ऊपर की तरह एक ही विधि का उपयोग नहीं कर सकता क्योंकि कई परिणाम नहीं हैं। मैंने मल्टी मैपिंग का उपयोग करने का प्रयास किया है, लेकिन यह एक आईनेमरेबल लौटने की अपेक्षा करता है।

मैं निम्नलिखित में कैसे मैप करूं?

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

धन्यवाद

बेन

उत्तर

6

खैर ... आप नहीं होगा ...

आप अपने PostModel संशोधन करने के लिए एक TOTALCOUNT संपत्ति ... जो वास्तव में है शामिल करने के लिए होगा बदसूरत। या एक गतिशील निष्पादित करें और इसे Select में रीमेप करें जो भी बदसूरत है।

आप देखते हैं, आप count(*) over() के साथ गिनती (*) एन बार लौट रहे हैं ... यह एक हैक है, इस हैक का उपयोग करना आवश्यक नहीं है। मैंने अपने कुछ परिदृश्यों में एक डबल क्वेरी चलाने से धीमे होने का मापन किया है, विशेष रूप से आप select count(*) में कुछ इंडेक्स को शॉर्टकट कर सकते हैं क्योंकि आप सभी कॉलम का चयन नहीं कर रहे हैं। इसके अतिरिक्त हैक कुछ पेजिंग अनुकूलन अक्षम करता है, उदाहरण के लिए आप क्वेरी में select top N जोड़ नहीं सकते हैं।

पेजिंग प्रश्नों के आसपास मेरी सिफारिश इंडेक्सिंग सही प्राप्त करना होगा, यह महत्वपूर्ण है। Perf को मापें और देखें कि यह हैक वास्तव में मदद करता है (जब सही अनुक्रमण हो रहा है)।

मैं स्ट्रिंग कॉन्सटेनेशन के आसपास की चिंताओं का पालन करता हूं, लेकिन आप हमेशा इसके लिए सामान्य सहायक विधियों को परिभाषित कर सकते हैं।

+0

प्रतिक्रिया के लिए धन्यवाद। मुझे लगता है कि मैं दोहरी क्वेरी के साथ रहूंगा और चीजों को सूखा रखने के लिए कुछ सहायकों का निर्माण करूंगा। –

संबंधित मुद्दे