دوره آموزشی Entity FrameWork Core - قسمت 28

دوره آموزشی Entity FrameWork Core - قسمت 27

صفحه بندی (Pagination) :

صفحه بندی به بازیابی نتایج در صفحات اشاره دارد نه همه به یکباره. این معمولاً برای مجموعه نتایج بزرگ انجام می شود، جایی که یک رابط کاربری نشان داده می شود که به کاربر اجازه می دهد تا به صفحه بعدی یا قبلی نتایج حرکت کند.

صرف نظر از روش صفحه بندی استفاده شده، همیشه مطمئن شوید که ordering شما کاملا منحصر به فرد است. عدم انجام این کار می تواند باعث برگرداندن داده های نادرست شود.به عنوان مثال، اگر نتایج فقط بر اساس تاریخ مرتب شوند، اما ممکن است چندین نتیجه با تاریخ یکسان وجود داشته باشد،. ordering بر اساس تاریخ و شناسه (یا هر ویژگی منحصر به فرد دیگر یا ترکیبی از پراپرتی ها) باعث می شود ordering کاملاً منحصر به فرد باشد و از این مشکل جلوگیری شود.توجه داشته باشید که پایگاه داده های رابطه ای هیچ ترتیبی را به طور پیش فرض اعمال نمی کنند، حتی در کلید اصلی.

صفحه بندی مبتنی بر Offset :

یک راه متداول برای پیاده سازی صفحه بندی با پایگاه داده استفاده از Skip and Take (OFFSET and LIMIT در SQL) است. با توجه به اندازه صفحه(10) نتیجه، صفحه سوم را می توان با EF Core به صورت زیر واکشی کرد:

var position = 20;
var nextPage = context.Posts
    .OrderBy(b => b.PostId)
    .Skip(position)
    .Take(10)
    .ToList();

این تکنیک دارای کاستی های جدی نیز می باشد:

  • پایگاه داده همچنان باید 20 ورودی اول را پردازش کند، حتی اگر آنها به برنامه بازگردانده نشوند. این احتمالاً بار محاسباتی قابل توجهی ایجاد می کند که با تعداد ردیف هایی که رد(skip) می شوند افزایش می یابد.
  • اگر هر به روز رسانی به طور همزمان اتفاق بیفتد، صفحه بندی شما ممکن است در نهایت از برخی ورودی ها صرف نظر کند یا آنها را دو بار نشان دهد. به عنوان مثال، اگر در حین حرکت کاربر از صفحه 2 به 3، یک ورودی حذف شود، کل مجموعه نتایج "shifts up"شده و یک ورودی skip می شود.


صفحه بندی مبتنی بر Keyset :

جایگزین پیشنهادی برای offset-based pagination که گاهی اوقات keyset pagination یا
seek-based pagination نامیده می‌شود - این است که به‌جای offset، از عبارت WHERE برای skip کردن ردیف‌ها استفاده کنید.

var lastId = 55;
var nextPage = context.Posts
    .OrderBy(b => b.PostId)
    .Where(b => b.PostId > lastId)
    .Take(10)
    .ToList();

با فرض اینکه یک index در PostId تعریف شده است، این پرس و جو بسیار کارآمد است و همچنین نسبت به تغییرات همزمانی(concurrent changes) که در مقادیر کمتر Id رخ می دهد حساس نیست.

صفحه‌بندی Keyset برای رابط‌های صفحه‌بندی که در آن کاربر به جلو و عقب حرکت می‌کند، مناسب است، اما از دسترسی تصادفی پشتیبانی نمی‌کند، جایی که کاربر می‌تواند به هر صفحه خاصی بپرد.

صفحه‌بندی با دسترسی تصادفی(random access pagination) نیاز به استفاده از offset-based pagination دارد که در بالا توضیح داده شد. به دلیل کاستی های صفحه بندی offset، به دقت در نظر بگیرید که آیا صفحه بندی با دسترسی تصادفی واقعاً برای مورد استفاده شما مورد نیاز است یا اینکه پیمایش صفحه بعدی/قبلی کافی است.

صفحه بندی مبتنی بر Multiple keys :

هنگام استفاده از keyset pagination، اغلب لازم است که بیش از یک property را order کنید . به عنوان مثال، پرس و جو زیر بر اساس تاریخ و شناسه صفحه بندی می شود:

var lastDate = new DateTime(2020, 1, 1);
var lastId = 55;
var nextPage = context.Posts
    .OrderBy(b => b.Date)
    .ThenBy(b => b.PostId)
    .Where(b => b.Date > lastDate || (b.Date == lastDate && b.PostId > lastId))
    .Take(10)
    .ToList();

این تضمین می کند که صفحه بعدی دقیقاً جایی را انتخاب می کند که صفحه قبلی به پایان رسیده است.

ایندکس سازی مناسب برای عملکرد خوب حیاتی است: اطمینان حاصل کنید که indexهایی در جای خود دارید که با ترتیب صفحه بندی شما مطابقت دارند. اگر با بیش از یک ستون ordering شود، می توان یک شاخص روی آن ستون های دیگر تعریف کرد. این composite index نامیده می شود.


بیشتر بخوانید : دوره آموزشی Entity FrameWork Core - قسمت 29

بیشتر بخوانید : دوره آموزشی Entity FrameWork Core

بیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Core

https://zarinp.al/farshidazizi