Pagination และรายการส่วนเฟรมเวิร์ก

0

คำถาม

ในของฉันเคลื่อนแอพอฉันพยายามกู้ข้อมูลจากโต๊ะของฉันภาษา sql เซิร์ฟเวอร์ฐานข้อมูล ฉันกำลังใช้ EF และฉันพยายามจะใช้ pagination ดีกว่าสำหรับการแสดง. ฉันต้องเก็บข้อมูลจากสุดท้ายของธาตุที่โต๊ะ ดังนั้นถ้าโต๊ะมี 20 แถวฉันต้องการสำหรับหน้า 0,ก็น่าจะเป็นบัตรประจำตั 20,19,18,อายุ 17,16 แล้วสำหรับหน้าที่ 1 ก็น่าจะเป็นบัตรประจำตั 15 นาที 14,13,12 อายุ 11 และดังนั้นบน...

ปัญหาคืออะไรถ้าหากในขณะที่ของผู้ใช้"A"กำลังดาวน์โหลดข้อมูลจากโต๊ะของผู้ใช้"B"เพิ่มแถว? ถ้าของผู้ใช้"A"ได้หน้า 0(งั้นก็น่าจะเป็นบัตรประจำตั 20, 19, 18, 17, 16), และของผู้ใช้"B"ในที่เดียวกันช่วงเวลาเพิ่มแถว(ดังนั้นหมายเลข 21)กับคลาสสิคกับการค้นหาผู้ใช้"A"สำหรับหน้า 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 เป็น int ได้มันมาจาก frontend.

จะให้ฉันแก้ปัญหาได้เหรอ?

ฉันเจอวิธีแก้ปัญหาแต่ฉันไม่รู้ว่ามันเป็นที่หนึ่ง ฉันควรใช้

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

แทนที่จะเป็น

.Skip (RecordsForPagination * Page)

และแน่นอน LastID เสมอก็คือส่งจาก frontend.

คุณคิดว่าการแสดงนั้นเป็นเรื่องดีเสมอบรหัสเหรอ? มีดีกว่าทางออก?

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

คำตอบที่ดีที่สุด

1

แสดง impacts จะเชื่อใจเธอ greatly ของคุณภาษา sql ดัชนี implementation และคำสั่งโดยเงื่อนไขว่า. แต่มันไม่ได้มากมายคำถามเกี่ยวกับการแสดงที่มันเป็นเรื่องเกี่ยวกับที่คาดหวังผลลัพธ์เดียวกันนั่นแหละ

อ่าเอ่อล้นออกมาเป็นคนยอดเยี่ยมตัวอย่างเช่นที่มีระดับเสียงของกิจกรรมของเรื่องนั้นตอนที่คุณต้องจุดจบของหน้าต่อหน้าอาจจะมีบันทึกจากหน้าคุณดูเพราะ underlying recordset มีการเปลี่ยน(มากกว่ากัปตัน..เสาทางนี้ต้องถูกเพิ่ม)

ฉันเอาเรื่องนี้ขึ้นมาเพราะในชีวิตของระบบมันคือโดยทั่วไปแล้วยอมรับและในบางคดีการ คาดหวัง พฤติกรรม. เป็นกลุ่มผู้พัฒนาเราซาบซึ้งในคอนถูกเพิ่ม overheads ของพยายามที่จะคงไว้ซึ่งคนเดียวผลลัพธ์ตั้งค่าและจำได้ว่ามันมักจะมากล่าค่าอยู่ในลังพยายามป้องกันสิ่งที่ดูเหมือน duplications อย่างที่คุณ iterate งหมดแล้ว

มันเป็นบ่อยมากพอที่จะอธิบายให้ผู้ใช้ทำไมมันเกิดขึ้นในหลายกรณีพวกเขาจะยอมรับมัน

ถ้ามันเป็นเรื่องสำคัญที่คุณต้องรักษาคนที่อยู่ในต้นฉบับผลตั้งครอบครัว constrain การสืบค้นกัน Where ข้อตกลงนั้นแต่คุณจะต้องดึงข้อมูเหมือนกันที่หมายเลขหรือวันที่และเวลาในดั้งเดิมกับการค้นหา. ในคดีของคุณคุณพยายามจะใช้ LastIDแต่เพื่อให้คนสุดท้ายชื่อจะต้องใช้แยกกับการค้นหาบนมันเป็นตัวเองเพราะ orderby ข้อตกลงนั้นจะมีผลกระทบกับมัน

คุณไม่สามารถใช้ .SkipWhile(x => x.ID >= LastID) สำหรับเรื่องนี้เพราะ ข้า เป็นแบบต่อเนื่องโพรเซสที่รับผลกระทบจากคำสั่งและเป็น dis-หมั้นกันคนแรกตัวอย่างเช่นคำว่า"ละเมิดลิขสิทธิ์ evaluates ต้อง 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 แต่มันขึ้นอยู่กับ implementation ที่กำลังกรอบวันที่สามารถเป็นน้อยลงมีประสิทธิภาพ

2021-11-22 23:55:04

ความตั้งใจของฉันไม่ต้องดึงข้อมู LastID จาก DB(เพราะอย่างที่คุณบอกว่ามันจะได้รับผลกระทบจาก Db ตัวมันเอง). ความตั้งใจของฉันนี่:-Frontend เก็บหน้าเว็บ 0 และผลเป็นก็น่าจะเป็นบัตรประจำตั 20, 19, 18, 17, 16 - Frontend เก็บหน้าเว็บ 1 และส่งเพื่อปรับแต่งโปรแกรมเบื้องหลังสอง param:หน้า 1 และ LastID ของหน้าก่อนนี้(ในกรณีนี้ LastID=16)->งั้นผลจะเป็นก็น่าจะเป็นบัตรประจำตั 15, 14, 13, 12, 11... สืบทอดต่อๆกันมา ของฉันภาษาอังกฤษยังไม่สมบูรณ์แบบ...เรากำลังพูดแบบเดียวกัน?
user1106897

@user1106897 งเทคนิคคริสนุเรียกว่า Keyset Paginationแล้วคือโดยทั่วไปแล้วดีขึ้นมากกว่าที่เรียกตัวโดยแถวนั่นคือสิ่งที่คุณกำลังพูดเกี่ยวกับ
Charlieface

มันมาก เป็น ยังเป็นคำถามของการแสดง:เรียกตัวโดนวนแถวสูงเสื่อมสภาพเหมือนก่อนแถวต้องอ่านทุกครั้ง แต่ทว่าเรียกตัวโดยกุญแจ(หรือว่าเวลาไม่มีร่องรอในกรณีนี้)เป็นคนที่มีประสิทธิภาพเพียงพอ smooth scrolling ถ้ามีคนสนับสนุนดัชนี
Charlieface

ชาร์ลีหน้าขอบคุณมากสำหรับการเชื่อมโยงจริงเกียรติอย่างยิ่ง ฉันจะพยายามจะใช้ advices
user1106897

ขอบคุณ@Charlieface แสดทักเป็นมากกว่าควรจะ"ลืมการแสดง SkipWhile(โดยหมายเลข)จะไม่แก้ปัญหาถ้าคุณเปลี่ยนคำสั่งคำว่า"ยอดเยี่ยมเชื่อมโยงด้วย!
Chris Schaller

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่