PDA

View Full Version : آموزش: Paging با استفاده از LINQ



raziee
پنج شنبه 03 دی 1388, 10:54 صبح
با سلام.
این مثال درباره پیاده سازی صفحه بندی توسط LINQ است.
کد های آن به صوت زیر است:

void PageDataBind(int Skip)
{
int take = 2;
dc = new MoviesDataContext();

var query = from m in dc.Movies select m;

int Counter = query.Count();
lblSum.Text = Counter.ToString();

List<myPageing> myP = new List<myPageing>();
for (int i = 0; i < Counter; i = i + take)
{
myP.Add(new myPageing { Value = i, Title = i + 1 });
}

Paging.DataSource = myP;
query = query.Skip(Skip).Take(take);

MovieRepeater.DataSource = query;
MovieGridView.DataSource = query;
MovieDataList.DataSource = query;
Page.DataBind();
}
به کمک Skip و Take میتوانیم عمل صفحه بندی را کنترل کنیم.

skip برای پرش رکورد ها ایت. به طور مثال اگر عدد 23 را به عنوان ورودی بگیرد از رک.رد 23 به بعد را بر میگرداند.
take تعداد رکورد های برگشت داده شده را مشخص میکند.

کد های زیر که از بدنه ی اصلی گرفته شده اند برای ایجاد دسترسی به صفحات هستند. که بعد از بدست آوردن تعداد کل رکورد ها بر اساس تعداد رکورد های برگشت داده شده صفحات را ایجاد میکند.
int Counter = query.Count();
lblSum.Text = Counter.ToString();

List<myPageing> myP = new List<myPageing>();
for (int i = 0; i < Counter; i = i + take)
{
myP.Add(new myPageing { Value = i, Title = i + 1 });
}

Paging.DataSource = myP

برای آموزش LINQ میتوانید به این تاپیک (http://barnamenevis.org/forum/showthread.php?t=193300)مراجعه کنید.

شاد باشید.

Behrouz_Rad
پنج شنبه 03 دی 1388, 12:52 عصر
در حد یک مثال خوبه اما کاربرد عملی نداره چون تمامی رکوردها رو لود می کنه و این یک فاجعه برای حافظه است. Paging صحیح فقط از طریق Stored Procedure و متد Row_Number در SQL Server قابل انجام هست.

موفق باشید.

raziee
پنج شنبه 03 دی 1388, 16:38 عصر
در حد یک مثال خوبه اما کاربرد عملی نداره چون تمامی رکوردها رو لود می کنه و این یک فاجعه برای حافظه است. Paging صحیح فقط از طریق Stored Procedure و متد Row_Number در SQL Server قابل انجام هست.

تشکر جناب راد.
هدفم استفاده از متد LINQ بود. فرمایش شما کاملا صحیحه در فایل ضمیمه همونطور که شما گفتید عمل شده و پیجینگ در بانک ساخته میشه. اما برای این کار دیگه به LINQ نیازی نیست درسته ؟ با همون دیتاست و ... میشه کار رو حل کرد.

Behrouz_Rad
پنج شنبه 03 دی 1388, 16:49 عصر
LINQ to SQL یک ORM هست. قابلیت کار با Stored Procedureها رو هم داره. به SP به چشم یک متد نگاه می کنه. Data Context جزء اصلی کار با LINQ to SQL هست. اجرای SP از طریق Data Context انجام میشه.
سعی کن تا حد ممکن از DataSet استفاده نکنی.

موفق باشید.

raziee
پنج شنبه 03 دی 1388, 19:10 عصر
سعی کن تا حد ممکن از DataSet استفاده نکنی.


با تشکر جناب راد.
میشه در این رابطه که چرا از dataset نباید استفاده کرد توضیحاتی رو بدین و یا لینک آموزشی رو محبت کنید.
استفاده از LINQ to Dataset رو هم مناسب نمیدونید؟

Behrouz_Rad
پنج شنبه 03 دی 1388, 21:34 عصر
برای بیان دلیل عدم استفاده از DataSet در ASP.NET به مقاله ی معروف برادر همیشه در صحنه، اسکات میشل، ارجاعت میدم:
http://www.4guysfromrolla.com/articles/050405-1.aspx

همین کافیه که بدونی چرا نباید از LINQ to DataSet استفاده کنی.

موفق باشید.

raziee
پنج شنبه 03 دی 1388, 21:44 عصر
ممنونم قربان
شما همیشه نسبت به بچه های این سایت لطف داشتید.
سپاسگذارم.

mohsen_zelzela00
پنج شنبه 03 دی 1388, 22:44 عصر
سعی کن تا حد ممکن از DataSet استفاده نکنی.

موفق باشید.

سلام آقای مهندس راد

مثل همیشه به موارد کلیدی اشاره می کنید.
به جای استفاده از DataSet از List<T> استفاده کنیم؟؟؟؟؟؟؟؟؟؟؟

Behrouz_Rad
پنج شنبه 03 دی 1388, 22:48 عصر
به جای استفاده از DataSet از List<T> استفاده کنیم؟

به جای استفاده از Typed DataSet، از Generic List و کلاس معادل موجودیت استفاده کن.

موفق باشید.

iman_ad
دوشنبه 07 دی 1388, 01:19 صبح
جناب راد استفاده از ORM در پروژه هایی که از sp استفاده می شه جایز می دونید؟
هر تغییر در بانک باید سمت برنامه هم انجام بشه آیا کار اضافی محسوب می شه یا محاسنی داره که به وقت و هزینه بیشتر می ارزه و اگه ORM چیز خوبی آیا ORM خواصی توصیه می کنید؟
مثل Nhibernate

Mostafa_Dindar
دوشنبه 07 دی 1388, 01:44 صبح
لزوما قويترين ORM بهترين ORM براي هر فرد نيست . با توجه به ويژگيهاي پروژتون + ميزان تجربه مناسب ترين را انتخاب كنيد .
NHibernate براي پروژه هاي EnterPrise و بزرگ مناسبه .

iman_ad
دوشنبه 07 دی 1388, 10:59 صبح
من معمولا از ORM استفاده نمی کنم چون کویری سمت برنامه ندارم می خواستم بدونم کار درستی می کنم یا مپینگ حسنایی داره که به دردسرش می ارزه، توی مقاله ای که آقای راد گذاشتن دیتا ریدر و دیتاست با هم مقایسه شده بودن ولی چیزی که هست دیتا ریدر آفلاین نیست بنابراین نیاز به استفاده با جنریک برای پر کردن اطلاعات داره آیا زمان پر کردن جنریک با زمان پر شدن دیتاست حدودا یکسان نیست؟
دوست دارم بیشتر در این موارد بحث کنیم

Behrouz_Rad
دوشنبه 07 دی 1388, 11:14 صبح
جناب راد استفاده از ORM در پروژه هایی که از sp استفاده می شه جایز می دونید؟
هر تغییر در بانک باید سمت برنامه هم انجام بشه آیا کار اضافی محسوب می شه یا محاسنی داره که به وقت و هزینه بیشتر می ارزه و اگه ORM چیز خوبی آیا ORM خواصی توصیه می کنید؟
مثل Nhibernate
یکی از قابلیت های اصلی ORMها، کار با SPها است. در این حالت، ORM به عنوان یک واسط برای اجرای SP عمل می کنه.
در استفاده از ORMها بین افراد مختلف اختلاف نظر زیادی وجود داره. بعضی ها معماری خاص خودشون رو دارن و برخی دیگه به ORMها اطمینان کامل دارن (مثل StackOverflow.com).
طبق نظر سنجی که چند وقت پیش خوندم، NHibernate بیشترین محبوبیت رو داره و بعد از اون LINQ to SQL هست.
به هر حال، آدمی سلایق مختلفی داره. شما امتحان کن ببین کدوم روش به مذاقت خوش میاد ;)

موفق باشید

Behrouz_Rad
دوشنبه 07 دی 1388, 11:16 صبح
من معمولا از ORM استفاده نمی کنم چون کویری سمت برنامه ندارم می خواستم بدونم کار درستی می کنم یا مپینگ حسنایی داره که به دردسرش می ارزه، توی مقاله ای که آقای راد گذاشتن دیتا ریدر و دیتاست با هم مقایسه شده بودن ولی چیزی که هست دیتا ریدر آفلاین نیست بنابراین نیاز به استفاده با جنریک برای پر کردن اطلاعات داره آیا زمان پر کردن جنریک با زمان پر شدن دیتاست حدودا یکسان نیست؟
دوست دارم بیشتر در این موارد بحث کنیم
منم دوست دارم بحث کنیم اما سوالتون ارتباطی با موضوع تاپیک نداره. لطفاً بر طبق موضوع تاپیک پیش برید.

ممنون.

shocraneh
دوشنبه 07 دی 1388, 12:37 عصر
به جای استفاده از Typed DataSet، از Generic List و کلاس معادل موجودیت استفاده کن.

موفق باشید.
من برای paging از برنامه گرید آقای راد استفاده کردم . خوب در اون برنامه از آبجکت dataset استفاده شده بود . آیا اون شیوه بهینه نیست ؟؟

m.hamidreza
دوشنبه 07 دی 1388, 12:56 عصر
iman_ad@:
برادر لطف کن سوالتو و کلا مباحث مرتبط با سوالت رو در یه تاپیک جدید ادامه بده...
ممنون.

Behrouz_Rad
دوشنبه 07 دی 1388, 13:15 عصر
من برای paging از برنامه گرید آقای راد استفاده کردم . خوب در اون برنامه از آبجکت dataset استفاده شده بود . آیا اون شیوه بهینه نیست ؟؟
وقتی میگی "برنامه ی Grid آقای راد"، اینجور در ذهن تداعی میشه که اون برنامه فقط یک نسخه داره در صورتی که اون پروژه، 7 نسخه داره. نسخه ی 7 رو دانلود کن تا متوجه منظورم بشی.

موفق باشید.

shocraneh
دوشنبه 07 دی 1388, 21:17 عصر
وقتی میگی "برنامه ی Grid آقای راد"، اینجور در ذهن تداعی میشه که اون برنامه فقط یک نسخه داره در صورتی که اون پروژه، 7 نسخه داره. نسخه ی 7 رو دانلود کن تا متوجه منظورم بشی.

موفق باشید.راستش من با ویبی کار می کنم نسخه آخر سی شارپ است .راستش خیلی روش وقت نزاشتم .

Mostafa_Dindar
چهارشنبه 01 اردیبهشت 1389, 00:06 صبح
در حد یک مثال خوبه اما کاربرد عملی نداره چون تمامی رکوردها رو لود می کنه و این یک فاجعه برای حافظه است. Paging صحیح فقط از طریق Stored Procedure و متد Row_Number در SQL Server قابل انجام هست.

موفق باشید.

سلام ،

اگر چه متد ارائه شده توسط ايجاد كننده تاپيك بهينه نيست و گفته آقاي راد صحيح هست ولي با جمله دوم ايشون مخالفم .

ما ميتونيم از طريق Linq to Sql هم Paging واقعي رو پياده سازي كنيم و محدود به استفاده از Stored Procedure نيستيم .

در مثال زير Paging ما بهينه هست :

public void bindProducts(int startrow)
{
DataClassesDataContext db = new DataClassesDataContext();
var products = from p in db.Products
where p.Order_Details.Count > 2
select new
{
ID = p.ProductID,
Name = p.ProductName,
numOrders = p.Order_Details.Count,
revenue = p.Order_Details.Sum(o => o.UnitPrice * o.Quantity),
};
GridView1.DataSource = products.Skip(startrow).Take(10);
GridView1.DataBind();
}


علت هم به خاطر اين هست كه Linq از deferred execution استفاده ميكند ، بعبارتي تا زماني كه درون داده هاي برگشتي Iterate نكنيم ، يا به كنترلهاي داده Bind نكنيم Query بر روي بانك داده اجرا نميشود

Rambod
چهارشنبه 01 اردیبهشت 1389, 11:06 صبح
با حرف جناب Lastphoenix (http://barnamenevis.org/forum/member.php?u=122118) کاملاً موافقم.
من قبلاً Paging رو با LinqDatasource و GridView تست کردم و در SQL Profiler دیدم که بصورت هوشمند در ساخت Query از Row_Number استفاده میشه.

Mostafa_Dindar
پنج شنبه 02 اردیبهشت 1389, 00:19 صبح
براي اينكه شك تون به يقين تبديل بشه به گفته Scott Guttire (http://weblogs.asp.net/scottgu/archive/2007/06/29/linq-to-sql-part-3-querying-our-database.aspx) ارجاعتان ميدم :


We can use the Skip() and Take() methods below to indicate that we only want to return 10 product objects - starting at an initial product row that we specify as a parameter argument:

http://www.scottgu.com/blogposts/linqtosql3/step17.jpg

Note above how I did not add the Skip() and Take() operator on the initial products query declaration - but instead added it later to the query (when binding it to my GridView datasource). People often ask me "but doesn't this mean that the query first grabs all the data from the database and then does the paging in the middle tier (which is bad)?" No. The reason is that LINQ uses a deferred execution model - which means that the query doesn't actually execute until you try and iterate over the results.