راه اول:
استفاده از stored procedureهای کمکی که خاص این قضیه ایجاد شدهاند. یکی از آنها Paging_RowCount است که توسط دوستم مسعود رمضانی معرفی شده. این ابزارها queryی (و احتمالاً stored procedure) شما دریافت کرده و Paging را روی آنها اعمال میکنند. بدی این ابزارها این است که محدودیتهای زیادی در query دریافتی اعمال و کرده و در خیلی از حالات کار نمیکنند. بدی دیگر آنها عدم خوانایی و قابلیت نگهداری پایین آنهاست چون Query ورودی این ابزارها معمولاً به صورت تیکه تیکه در داخل کد C# نگهداری میشود. البته من چندان تخصصی روی SQL ندارم و با کل این ابزار به طور کامل کار نکردهام اما همین دلیل دوم برای من کافی است تا از آن دوری کنم.
راه دوم:
استفاده از Named SQL Queries در NHibernate است. در این روش شما میتوانید با استفاده از SetFirstResult و SetMaxResults وظیفه Paging را به عهده NHibernate بگذارید. در این حالت NHibernate خودش به طور خودکار و پشت پرده مشابه روش اول عمل کرده و Paging را برای شما مهیا مینماید. این روش بسیار زیبا، راحت، خوانا و قابل نگهداری است اما بدی آن این است که در بعضی حالات که Query کمی پیچیده میشود عمل نمیکند. یعنی این که بیشتر برای Queryهای ساده مناسب است.
راه سوم:
وقتی که نمیخواهید از روش اول استفاده کنید و روش دوم هم درست کار نمیکند مجبورید خودتان وظیفه Paging را به عهده بگیرید. یعنی کاری را که روشهای اول و دوم به صورت خودکار انجام میدادند شما به صورت دستی انجام دهید. روش معمول برای Paging در MS SQL Server که راههای اول و دوم هم از آن استفاده میکنند روش ROW_NUMBER() است. من خودم برای انجام این کار از یک Query حاضر و آماده که توسط NHibernate تولید میشد استفاده میکنم. به نمونه اسکریپت زیر توجه فرمایید:
SELECT TOP (@maxResults) * FROM (
select
*
,ROW_NUMBER() OVER(ORDER BY (@orderBy)) as _sort_row from
Toy
)as query WHERE query._sort_row > @firstResult
ORDER BY query._sort_row
دیدگاهها
I think that is one of the so much important information for me.
And i am happy reading your article. However wanna commentary
on some general issues, The web site taste is perfect, the articles is
in reality nice : D. Good activity, cheers
Take a look at my blog post :: phlebotomy classes online
()