در هنگام ساخت APIهای صفحهبندی شده، معمولاً کدی نوشته میشود که شامل دو پرسوجو به پایگاه داده است: یکی برای دریافت تعداد کل رکوردهای مطابقتکننده و دیگری برای دریافت صفحهی مورد نظر از دادهها. این روش، اگرچه کارآمد است، اما میتواند پرهزینه باشد، بهویژه در جداول بزرگ یا پرسوجوهای پیچیده، زیرا یک شرط WHERE یکسان دو بار اجرا میشود.
تابع پنجره COUNT(*) OVER() در SQL Server این مشکل را به طور مؤثری حل میکند. با افزودن این تابع به دستور SELECT، تعداد کل رکوردهای مطابقتکننده با شرط WHERE محاسبه میشود، اما نتیجه همراه با دادههای صفحهبندی شده در یک پرسوجوی واحد برگردانده میشود.
این روش با افزودن یک ستون TotalCount به هر ردیف در مجموعه نتایج، امکان دریافت تعداد کل رکوردهای مطابقتکننده را بدون نیاز به پرسوجوی جداگانه فراهم میکند. این ستون حاوی همان مقدار برای تمام ردیفها است و میتوان آن را از اولین ردیف دریافت کرد.
برای استفاده از این روش در C# با استفاده از Dapper، میتوان نتایج پرسوجو را به یک لیست تبدیل کرد و سپس مقدار TotalCount را از اولین ردیف استخراج کرد. همچنین، میتوان یک DTO (Data Transfer Object) ایجاد کرد که شامل ستون TotalCount باشد تا کد خواناتر و سازمانیافتهتر شود.
این تکنیک در مواردی که با پرسوجوهای پیچیده، جداول بزرگ، APIهای با ترافیک بالا یا CTEها و زیرپرسوجوهای پرهزینه سروکار داریم، بسیار مفید است. با این حال، در مواردی که فقط به تعداد رکوردهای مطابقتکننده نیاز داریم یا دقت شمارش بسیار حیاتی است، ممکن است روشهای جایگزین مناسبتر باشند.
مشاهده مطلب اصلی