با سلام
امکانات Object Model شرپوینت به شما این امکان را میدهند تا بتوانید نرم افزارهایی بر طبق این تکنولوژی ایجاد کنید ، در همین راستا مقالات بسیار زیادی هم در اینترنت در مورد نحوه استفاده صحیح از این امکانات وجود دارد ، به طور مثال Best Practices نمونه ای از این مقالات است که توسط مایکروسافت عرضه میشود و به برنامه نویسان شرپوینت این امکان را می دهد تا بتوانند نرم افزارهایی با قدرت و کارایی بالا ایجاد نمایند .
بیشتر سناریوهایی که برای ایجاد یک نرم افزار به کار گرفته میشود در مورد لیست هاست که شامل نمایش و تغییرات در آنها میباشد که متاسفانه بیشتر مشکلات و همچنین عدم کارایی را در این قسمت میتوانیم مشاهده کنیم زیرا از امکانات آبجکت مدل شرپوینت به خوبی استفاده نمیشود و این موضوع باعث کاهش کارایی نرم افزار می شود .
در مقاله ی امروز در مورد استفاده بهتر از امکانات آبجکت مدل شرپوینت صحبت خواهیم کرد و سعی میکنم تا تجربیات خود و همچنین مطالب ارزشمندی که در این زمینه موجود است را خدمت شما دوستان عزیز ارائه کنم و در مقالات بعد آن را تکمیل تر نمایم .
1 – چه تعداد آیتم در لیست ذخیره شده است ؟
جواب های مختلفی میتوان به این سوال داد ، در واقع راه های مختلفی برای به دست آوردن پاسخ این سوال وجود دارد ، به عنوان مثال در زیر میتوانید کدی را مشاهده نمایید که این کار را برای ما انجام می دهد :
int noOfItems = SPContext.Current.List.Items.Count;
این کد به ما تعداد آیتم هایی که در این لیست وجود دارد را نمایش میدهد اما حقیقت این است که این کد تمام آیتم های این لیست در دیتابیس را به ما برمیگرداند ، شکل زیر به ما نشان میدهد که در هنگام اجرا کردن کد و دسترسی به مشخصه Count چه اتفاقی می افتد :
این کد در مواقعی که لیست های ما تعداد آیتم های کمی داشته باشند مشکلی ایجاد نخواهد کرد ولی به مرور زمان و با زیاد شدن تعداد آیتم های لیست مشکلاتی را برای ما به وجود خواهد آورد .
اما راه حل چیست ؟
مایکروسافت یک ویژگی بسیار خوب را برای ما فراهم کرده است و آن ItemCount از شی ء SPList می باشد که در زیر میتوانید نحوه استفاده از آن را ملاحظه بفرمایید :
int noOfItems = SPContext.Current.List.ItemCount;
در این کد شرپوینت فقط میبایست به یک رکورد از دیتابیس رجوع کند ، در واقع شما با استفاده از این کد به راحتی میتوانید فقط با کوئری زدن به یک رکورد اطلاعات لازم در مورد تعداد آیتم ها را بدست آورید و احتیاج به استخراج تمام داده های ذخیره شده در لیست نیست .
2 – نمایش تعداد آیتم های یک لیست با استفاده از SPList
راه های بسیار زیادی برای نمایش آیتم های یک لیست وجود دارد ، شما با استفاده از یک حلقه میتوانید محتویات یک لیست را به دست آورده و نمایش دهید ، این کار ممکن است در کامپیوتری که برای توسعه در نظر گرفتید و یا برای لیست های کوچک بسیار خوب کار کند اما باید به شما بگویم که با افزایش تعداد آیتم های لیست به شدت کارایی نرم افزار شما کاهش میابد !
برای اثبات این موضوع بیایید با هم نگاهی به کد زیر بیاندازیم که 100 آیتم اول لیست جاری را به ما نمایش میدهد :
SPList activeList = SPContext.Current.List;
for (int i = 0; i < 100 && i < activeList.Items.Count; i++)
{
SPListItem listItem = activeList.Items[i];
htmlWriter.Write(listItem["Title"]);
}
فرض کنید که کمتر از 100 آیتم در این لیست موجود باشد ، فکر میکنید چند بار ارتباط با دیتابیس برقرار میشود تا بتوانید 100 عنوان اول این لیست را نمایش دهید ؟ با آنالیز تراکنش های کد بالا متعجب خواهید شد که تقریبا 200 بار این اتفاق رخ می دهد !
این مشکل به این خاطر می باشد که با هر اجرای این حلفه ما یک نمونه جدید از SPListIemCollection را فراخوانی میکنیم که در واقع به خاطر استفاده از Items این اتفاق رخ می دهد .
صفت Items کش نمی شود و به همین خاطر با هر درخواست این عمل تکرار می شود ، در شکل میتوانید این موضوع را به خوبی ملاحظه نمایید :
همانطور که ملاحظ میکنید زمان بسیار زیادی برای اجرای این کد به کار گرفته می شود که در نهایت باعث کاهش کارایی برنامه شما می شود .
راه حل چیست ؟
مسلما بهترین راه برای حل این مشکل استفاده از SPListItemCollection میباشد ، با استفاده از شی ء دیتابیس فقط یکبار کوئری میزند و با شمارش حلقه نتیجه در این کالکشن ذخیره می شود ، نمونه کد اصلاح شده را در زیر میتوانید مشاهده نمایید :
SPListItemCollection items = SPContext.Current.List.Items;
for (int i = 0; i < 100 && i < items.Count; i++)
{
SPListItem listItem = items[i];
htmlWriter.Write(listItem["Title"]);
}
در شکل زیر میتوانید نحوه اجرای برنامه پس از تغییر کد را ببینید :
در شکل بالا کاملا مشخص است که صرفه جویی بسیار زیادی در مدت زمان دریافت اطلاعات از دیتابیس را داریم و شما به عنوان یک برنامه نویس همیشه باید بهترین راه حل را برای بالا بردن کارایی داشته باشید .
3 – استفاده از SPQuery و SPView برای دریافت اطلاعاتی که به آنها نیاز دارید
یکی از مهمترین مسائلی که در تمام نرم افزارها وچود دارد جستجوی اطلاعات مورد نیاز کاربر از دیتابیس می باشد ، در واقع گزارشاتی که کاربران و مدیران از یک نرم افزار میخواهند ، روش های زیادی برای این کار وجود دارد ولی شما به عنوان یک برنامه نویس باید به این نکته توجه داشته باشید که چه راه حلی برای نرم افزار شما بهتر است .
اگر با دقت به 2 مسئله قبلی نگاه کرده باشید متوجه میشوید که با هر کوئری که بر روی دیتابیس اجرا میکنید ، دیتابیس تمام اطلاعات را مورد پردازش قرار می دهد ، به دستور Select در دو مسئله قبلی توجه کنید ( Select Top 2147483648 )
راه حل چیست ؟
یکی از راه های مناسب محدود کردن تعداد آیتم هایی است که مورد پرداش قرار خواهند گرفت که این کار را میتوانید با استفاده از صفت SPQuery.RowLimit انجام دهید .
به مثال زیر توجه کنید :
SPQuery query = new SPQuery();
query.RowLimit = 100;
SPListItemCollection items = SPContext.Current.List.GetItems(query);
for (int itemIx = 0; itemIx < items.Count; itemIx++)
{
SPListItem listItem = items[itemIx];
}
با اجرای این دستور میتوانید نتیجه متفاوتی را مشاهده نمایید :
اگر به برنامه هایی که مینویسید توجه کنید ، شما همیشه احتیاج به این ندارید که تمام آیتم های یک لیست را نمایش دهید یا مورد پردازش قرار دهید و با این تکنیک کوچک ولی کاربردی میتوانید کارایی برنامه خود را بالا ببرید . کد بالا برای مواقعی که میخواهیم از تمام ستون های یک لیست برای پردازش اطلاعات استفاده کنیم مناسب است ، اما حالا مسئله دیگری را در نظر میگیریم ، اگر فقط برخی از ستونهای یک لیست را برای گزارش احتیاج داشته باشیم چگونه میتوانیم کدی با کارایی بالاتر بنویسیم ؟
دو روش برای محدود کردن تعداد فیلدها وجود دارد :
1 – استفاده از کلاس SPView به صورت زیر :
SPQuery query = new SPQuery(SPContext.Current.CurrentView.View);
2 – استفاده از صفت SPQuery.ViewFields به صورت زیر :
SPQuery query = new SPQuery();
query.ViewFields = "<FieldRef Name='ID'/><FieldRef Name='Text Field'/><FieldRef Name='XYZ'/>";
با اجرای هر کدام از روشهای بالا کوئری شما محدوده کمتری از اطلاعات را مورد پردازش قرار داده و در نتیجه کارایی برنامه شما بالاتر می رود ، به شکل های زیر توجه کنید :
خوب ، امیدوارم تا اینجا این مقاله برای شما مفید بوده باشه ، در مقالات بعدی تکنیک های بیشتری را مورد بررسی قرار خواهم داد .
موفق و پیروز باشید .



موضوعات مشابه: