2012-03-24 11 views
35

मैं डैपर ओआरएम की कोशिश कर रहा हूं और मैं एक पोस्ट टेबल से पूछताछ कर रहा हूं।डैपर। पेजिंग

लेकिन मैं पृष्ठांकित परिणाम प्राप्त करना चाहते हैं ...

1 - मैं यह कैसे कर सकते हैं? क्या इसके लिए कोई सहायक नहीं है?

2 - क्या डैपर क्वेरी एक IQueryable लौटा सकता है?

धन्यवाद, मिगुएल

+4

चूंकि आपने अभी डैपर के बारे में पता चला है ... मुझे उम्मीद है कि आपने [पेटापोको] (https://github.com/toptensoftware/PetaPoco) (अंतर्निहित पेजिंग समर्थन के साथ) और [Massive] के बारे में भी सुना है (https://github.com/robconery/massive) ... बस FYI ताकि आप वह विकल्प चुन सकें जो आपको सबसे अच्छा लगा ... वे सभी बेहद तेज़ और बहुत समान हैं फिर भी अलग हैं। –

+0

देखें: http://samsaffron.com/archive/2011/09/05/Digging+ourselves+out+of+the+mess+Linq-2-SQL+created –

उत्तर

28

1) डैप्पर एक नहीं है में निर्मित पृष्ठांकन सुविधा। लेकिन इसे सीधे पूछताछ में लागू करना बहुत मुश्किल नहीं है। उदाहरण:

SELECT * 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY InsertDate) AS RowNum, * 
      FROM  Posts 
      WHERE  InsertDate >= '1900-01-01' 
     ) AS result 
WHERE RowNum >= 1 // *your pagination parameters 
    AND RowNum < 20 //* 
ORDER BY RowNum 

एसक्यूएल सर्वर 2005+

2) डैप्पर रिटर्न एक IEnumerable<T> की आवश्यकता है।

+4

लेकिन यदि यह एक आईनेमरेबल लौटाता है तो यह बंद नहीं है ? मेरा मतलब है कि अगर मैं इसे IQueryable में बदलता हूं तो पेजिंग स्मृति में किया जाएगा और SQL सर्वर में नहीं। तो मुझे लगता है कि आपका दृष्टिकोण बेहतर है ... –

+3

हां, IENumerable "बंद" है और डीबी संदर्भ के लिए कोई लिंक नहीं है क्योंकि आप इसे EQuery के साथ IQueryable संदर्भ से जानते हैं। – Alex

+0

डैपर v1.13 एक .ToList() करता है यदि आप डिफ़ॉल्ट बफर नहीं बदलते हैं। इसके अलावा अंतर्निहित कोड पहले से ही क्वेरी निष्पादित कर रहा है और IDataReader को प्रस्तुत कर रहा है। पढ़ें() तो टेक और छोड़कर काम नहीं करेगा। तो नहीं, डैपर एक IQueryable वापस नहीं कर सकता है। – BillRob

55

आप एक डेटाबेस या संस्करण निर्दिष्ट नहीं किया। यदि आपके पास पर्याप्त भाग्यशाली ब्रांड के नए SQL Server 2012 का उपयोग करें और MSDN की पहुंच है करने में सक्षम हो रहे हैं, तो आप चमकदार नया OFFSET और FETCH खोजशब्दों का उपयोग कर सकते हैं। निम्न क्वेरी 20 रिकॉर्ड छोड़ सकते हैं और अधिक जानकारी के लिए बाहर लौट अगले 5.

SELECT * FROM [Posts] 
ORDER BY [InsertDate] 
OFFSET 20 ROWS 
FETCH NEXT 5 ROWS ONLY 

चेक http://msdn.microsoft.com/en-us/library/ms188385(v=sql.110).aspx#Offset होगा।

इसके अलावा, यह बड़े पैमाने पर जिस तरह से नकल करता है और IDbConnection के लिए अपने स्वयं के एक्सटेंशन विधि लिखना आसान काफी है। यहां भारी कोड है।

var query = string.Format("SELECT {0} FROM (SELECT ROW_NUMBER() OVER (ORDER BY {2}) AS Row, {0} FROM {3} {4}) AS Paged ", columns, pageSize, orderBy, TableName, where); 
+0

नहीं पता था कि एसक्यूएल 2012 पहले से ही उपलब्ध था। हालांकि यह आरसी पर था ... धन्यवाद –

+7

व्यक्तिगत रूप से, मैं इस सामान के लिए एसक्यूएलबिल्डर का उपयोग करता हूं, यह पता चला है कि गैर-तुच्छ पिंगिंग प्रश्न (विशेष रूप से बहु-मैपिंग शामिल करने वाले लोगों को) उच्च perf देखने के लिए विशेष देखभाल की आवश्यकता होती है: http: // samsaffron.com/archive/2011/09/05/Digging+ourselves+out+of+the+mess+Linq-2-SQL+created –

+1

उस क्वेरी को पैरामीटरेट करें !! – pimbrouwers

-8

आप SQL Server 2012 नहीं है, तो या आप अन्य डीबीएमएस है, एक ही रास्ता पेजिंग करने के लिए DBMS और वेब सर्वर या ग्राहक के बीच प्रसंस्करण विभाजित करने के लिए है। --- यह केवल छोटे सेट आकार के लिए सिफारिश की है। आप डेटा सेट में पंक्तियों के शीर्ष संख्या प्राप्त करने के Oracle में 'टॉप' MySql में SQL सर्वर या सीमा में कीवर्ड या ROWNUM उपयोग कर सकते हैं।

top = skip + take; 

उदाहरण के लिए, आप 100 पंक्तियों को छोड़ना चाहते हैं और लेने के अगले 50: पंक्तियों जिसे आप लाना होता है की संख्या संख्या है कि आप को छोड़ होगा प्लस संख्या है कि आप ले जाएगा के बराबर

top = 100 + 50 

तो अपने एसक्यूएल बयान इस (एसक्यूएल सर्वर स्वाद) कैसा दिखेगा

SELECT TOP 150 Name, Modified, content, Created 
FROM  Posts 
WHERE  Created >= '1900-01-01' 

क्लाइंट पर: अगर आप सी # की तरह एक .NET भाषा का प्रयोग कर रहे हैं और का उपयोग कर विकास

var posts = connection.Query<Post>(sqlStatement, dynamicParameters); 
return posts?.ToList().Skip(skipValue).Take(takeValue); 
+1

मैं इस समाधान की अनुशंसा नहीं कर सकता क्योंकि यदि आपके डेटाबेस में आपके पास कई रिकॉर्ड हैं, तो आप सभी रिकॉर्ड्स को ट्रांसमिट कर रहे हैं स्मृति और फिर आप अपने आवेदन पक्ष पर फ़िल्टर करते हैं। आपको डीबी पक्ष पर डेटा फ़िल्टर और पगनेट करना चाहिए। –

+2

उपरोक्त समाधान स्पष्ट रूप से बताता है कि इसका उपयोग छोटे आकार के आकार के लिए किया जा सकता है। अपनी परिभाषा से पेजिंग रिकॉर्ड के एक छोटे से सेट के साथ सौदा करता है। – ErnestoDeLucia

+0

लेकिन भले ही आपका पेज डेटा डेटा का एक छोटा सा सेट हो, फिर भी आप पूरे सेट को वापस लोड कर रहे हैं जो स्मृति में बहुत बड़ा हो सकता है। –

0

मैं डैप्पर कस्टम पेजिंग डेमो के लिए एक नमूना प्रोजेक्ट बनाया, समर्थन छँटाई, मानदंड और फिल्टर:

apper, आप उन पंक्तियों के एक नंबर छोड़ सकते हैं और इसलिए तरह पंक्तियों की संख्या लेने के लिए LINQ का उपयोग कर सकते

https://github.com/jinweijie/Dapper.PagingSample

असल में, विधि इस प्रकार है:

Tuple<IEnumerable<Log>, int> Find(LogSearchCriteria criteria 
     , int pageIndex 
     , int pageSize 
     , string[] asc 
     , string[] desc); 

पहले वापसी मान आइटम सूची है।दूसरा रिटर्न वैल्यू कुल गिनती है।

उम्मीद है कि यह मदद करता है।

धन्यवाद।

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