पृष्ठ पर अंक लगाना, और इकाई की रूपरेखा

0

सवाल

मेरे मोबाइल एप्लिकेशन, मैं कोशिश करने के लिए पुनः प्राप्त डेटा की एक मेज से मेरा एसक्यूएल सर्वर डेटाबेस । मैं का उपयोग कर रहा हूँ एफई और मैं कोशिश का उपयोग करने के लिए पृष्ठ पर अंक लगाना बेहतर प्रदर्शन के लिए. मैं की जरूरत है डेटा प्राप्त करने के लिए से पिछले तत्व के टेबल पर. तो अगर टेबल पर 20 पंक्तियों में, मैं की जरूरत है, के लिए पृष्ठ 0, आईडी 20, 19, 18, 17, 16 तो के लिए पृष्ठ 1 आईडी 15, 14, 13, 12, 11,,, और इतने पर...

समस्या यह है: क्या होगा अगर, जब उपयोगकर्ता "एक" है, डाउनलोड करने के डेटा तालिका से, उपयोगकर्ता "बी" पंक्ति जोड़ें? यदि उपयोगकर्ता "एक" पृष्ठ 0 तो (IDs 20, 19, 18, 17, 16), और उपयोगकर्ता "बी" एक ही पल में जोड़ें पंक्ति (तो आईडी 21) के साथ, क्लासिक प्रश्न, उपयोगकर्ता "एक" के लिए पृष्ठ 1 प्राप्त होगा आईडी 16, 15, 14, 13, 12... तो एक बार आईडी 16

अपने कोड बहुत सरल है:

int RecordsForPagination = 5; 
var list = _context.NameTable
                   .Where(my_condition)
                   .OrderByDescending(my_condition_for ordering)
                   .Skip (RecordsForPagination * Page)
                   .Take (RecordsForPagination)
                   .ToList();

बेशक Page है पूर्णांक से आते हैं कि दृश्यपटल.

कैसे कर सकते हैं मैं इस समस्या को हल?

मैं एक हल मिल गया, लेकिन मैं नहीं पता है अगर यह सही एक है. मैं का उपयोग कर सकता है

.SkipWhile(x => x.ID >= LastID) 

इसके बजाय

.Skip (RecordsForPagination * Page)

और बेशक LastID हमेशा से भेजा जाता है के दृश्यपटल.

क्या आपको लगता है कि प्रदर्शन हमेशा अच्छा है के साथ इस कोड? वहाँ एक बेहतर समाधान है?

entity-framework linq sql-server
2021-11-22 23:06:34
1

सबसे अच्छा जवाब

1

प्रदर्शन के प्रभावों पर काफी निर्भर करेगा अपने SQL सूचकांक कार्यान्वयन और order by खंड. लेकिन इसकी बहुत ज्यादा नहीं तो के बारे में एक सवाल के प्रदर्शन के रूप में यह है के बारे में हो रही है परिणाम की उम्मीद है.

पोट अतिप्रवाह एक महान उदाहरण है जहाँ वहाँ है एक मात्रा की गतिविधि ऐसी है कि जब आप के अंत करने के लिए किसी भी पृष्ठ, अगले पृष्ठ पर शामिल कर सकते हैं रिकॉर्ड पृष्ठ से आप सिर्फ देखा है, क्योंकि अंतर्निहित recordset बदल गया है (अधिक पदों के लिए जोड़ा गया है)

मैं इस ऊपर लाने, क्योंकि एक जीवित प्रणाली यह आम तौर पर स्वीकार किए जाते हैं और कुछ मामलों में एक उम्मीद व्यवहार. डेवलपर्स के रूप में हम सराहना करते हैं जोड़ा गया ओवरहेड्स की कोशिश कर रहा है बनाए रखने के लिए एक ही परिणाम सेट और पहचान है कि वहाँ आमतौर पर बहुत कम मूल्य में की कोशिश कर रहा है को रोकने के लिए क्या की तरह लग रहा है duplications के रूप में आप की पुनरावृति पृष्ठों की है ।

यह अक्सर पर्याप्त है समझाने के लिए उपयोगकर्ताओं के लिए क्यों यह तब होता है, कई मामलों में वे इसे स्वीकार करेंगे

अगर यह महत्वपूर्ण था करने के लिए आप को बनाए रखने के लिए जगह में मूल परिणाम सेट है, तो आप चाहिए विवश क्वेरी के साथ एक Where खंड, लेकिन आप की जरूरत है पुनः प्राप्त करने के लिए या तो आईडी या टाइमस्टैम्प में मूल क्वेरी । आपके मामले में आप प्रयास कर रहे हैं का उपयोग करने के लिए LastIDहै , लेकिन प्राप्त करने के लिए पिछले आईडी की आवश्यकता होगी एक अलग प्रश्न यह है खुद पर, क्योंकि orderby खंड को प्रभावित करेगा ।

आप नहीं कर सकते हैं वास्तव में का उपयोग करें .SkipWhile(x => x.ID >= LastID) इस के लिए, क्योंकि छोड़ रहा है, एक अनुक्रमिक प्रक्रिया है कि आदेश से प्रभावित है और जिले से लगे हुए पहला उदाहरण है कि अभिव्यक्ति का मूल्यांकन करने के लिए falseहै , तो अपने आदेश पर आधारित नहीं है Id, अपने को छोड़, जबकि परिणाम हो सकता है लंघन कोई रिकॉर्ड नहीं सब पर है ।

int RecordsForPagination = 5; 
int? MaxId = null;
...
var query = _context.NameTable.Where(my_condition);
// We need the Id to constraint the original search
if (!MaxId.HasValue)
    MaxId = query.Max(x => x.ID);

var list = query.Where(x => x.ID <= MaxId)
                .OrderByDescending(my_condition_for ordering)
                .Skip(RecordsForPagination * Page)
                .Take(RecordsForPagination);
                .ToList();

यह है आम तौर पर सरल द्वारा फिल्टर करने के लिए समय में एक बिंदु के रूप में इस से जाना जाता है के बिना ग्राहक के लिए एक गोल यात्रा के लिए DB, लेकिन कार्यान्वयन पर निर्भर करता है छानने तारीखों पर जा सकते हैं कम कुशल है ।

2021-11-22 23:55:04

मेरा इरादा नहीं था पुनः प्राप्त करने के लिए LastID से डीबी (क्योंकि, जैसा कि आप ने कहा, इस से प्रभावित होगा Db ही). मेरा इरादा यह था: - दृश्यपटल पृष्ठ पुनः प्राप्त 0 और परिणाम रहे हैं आईडी 20, 19, 18, 17, 16 - दृश्यपटल पृष्ठ पुनः प्राप्त 1 और पारित करने के लिए बैकएंड दो परम: पेज 1 और LastID का पिछला पृष्ठ (इस मामले में LastID = 16) -> तो परिणाम होगा आईडी 15, 14, 13, 12, 11... और इतने पर । मेरी अंग्रेजी सही नहीं है... हम एक ही बात कह?
user1106897

@user1106897 तकनीक क्रिस के लिए संदर्भित करता है कहा जाता है Keyset पृष्ठ पर अंक लगाना, और आम तौर पर की तुलना में ज्यादा बेहतर पेजिंग द्वारा पंक्तियाँ, जो है कि तुम क्या कर रहे हैं के बारे में बात कर
Charlieface

यह बहुत ज्यादा है, यह भी एक सवाल का प्रदर्शन: पेजिंग पंक्तियों द्वारा अत्यधिक अक्षम के रूप में सभी पिछले पंक्तियों की जरूरत है, पढ़ा जा करने के लिए हर समय. जबकि पेजिंग द्वारा कुंजी (या समय में इस मामले में) अत्यधिक कुशल है, अगर वहाँ एक समर्थन सूचकांक
Charlieface

चार्ली चेहरा बहुत बहुत धन्यवाद लिंक के लिए, वास्तव में सराहना की है । मैं कोशिश करता हूँ का उपयोग करने के लिए सलाह
user1106897

धन्यवाद @Charlieface प्रदर्शन टिप्पणी में अधिक था करने के लिए माना जाता हो "भूल प्रदर्शन, SkipWhile(आईडी) समस्या का समाधान नहीं होगा, तो आप आदेश को बदल" महान लिंक भी!
Chris Schaller

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में