travel

افزایش عملکرد و کارایی Entity Framework

دانستن این نکات به ما کمک میکند تا با رعایت کردن آنها بهترین عملکرد را در سرعت و کارایی برای برنامه خود به ارمغان بیاوریم. در این مقاله به برخی از مهمترین مواردی که میتوان به سادگی آنها را رعایت کرد و انجام داد میپردازیم.


Linq To Entity یک ORM بسیار قدرتمند است که برای کوئری نویسی و مدیریت دیتابیس استفاده میشود. از آنجایی که این ابزار امکانات بسیار زیادی را در اختیار برنامه نویس گذاشته است بیش از هر چیز باید نکاتی را بدانیم که با رعایت آنها میتوانیم بهترین عملکرد و کارایی (Performance)را از این ORM بدست آوریم.

دانستن این نکات به ما کمک میکند تا با رعایت کردن آنها بهترین عملکرد را در سرعت و کارایی برای برنامه خود به ارمغان بیاوریم.

در این مقاله به برخی از مهمترین مواردی که میتوان به سادگی آنها را رعایت کرد و انجام داد میپردازیم.

  1. اجتناب از قرار دادن تمام اشیاء دیتابیس در یک مدل (Entity Model)

همانطور که میدانید مدل (Entity Model) شامل داده هایی است که کاربر با آنها سروکار دارد. این مدل میتواند شامل کلاس هایی باشد که از آنها به عنوان View Model یاد می شود و هر کدام نماینده یک جدول از دیتابیس است یا میتواند شامل کلاس هایی باشد که منطق انجام کار، قوانین اعتبارسنجی و تبدیل داده ها به فرمت مناسب و... را انجام میدهند که در این صورت به آنها Domain Model گفته میشود. در هر صورت Entityt Model یک قسما زا واحد کاری شما باید باشد. اگر دیتابیس شما اشیایی دارد که همیگی با یکدیگر در ارتباط نیستند لزومی ندارد همه را در یک مدل قرار دهید. چرا که همه مدل را در حافظه قرار دادن در حالی که از بسیاری از اشیاء آن استفاده نمیکنیم کار اشتباهی است و این کار باعث کاهش کارایی برنامه میشود.

بنابراین تنها کلاس هایی که به یگدیگر مرتبط هستند را در یک مدل قرار دهید.

 

  1. غیرفعال کردن Change Tracking

Change Tracking یکی از ویژگی های EntityFramwork  است. زمانی که یک رکورد ار دیتابیس یا لیستی از رکوردهای دیتابیس را بازیابی میکنید EF (EntityFramework) یک کپی از آنها در حافظه خود نگه میدارد. دلیل این امر در وهله اول این است که بتواند تغییراتی که شما اعمال میکنید را با نسخه اولیه مقایسه کند. اما این کار تنها زمانی خوب است که بخواهیم ویرایشی انجام دهیم. بنابراین زمانی که داده هایی را تنها جهت نمایش از دیتابیس بازیابی میکنید بهتر است که صراحتا این موضوع را به EF اعلام کنید

NorthwindDataContext context = new NorthwindDataContext() context.tblCities.MergeOption = MergeOption.NoTracking; 

 

و یا بصورت زیر به ازای هر کوئری میتوانیم عمل کنیم

var compare = (from itemFlowSubject in context.FlowSubject

                           where itemFlowSubject.FlowIdref == id

                    select itemsubject).AsNoTracking().ToList();

 

  1. استفاده از Pre-Gemerating برای کاهش زمان پاسخگویی در اولین درخواست ها

زمانی که شی ای از objectContext در برنامه برای اولین بار ساخته میشود EF مجموعه از کلاس ها را که برای دسترسی به دیتابیس لازم است، ایجاد میکند. این کلاس ها دروافع ایاد کننده همان View های برنامه هستند. اگر Model شما بزرگ باشد ایجاد این کلاس ها ممکن است وقفه ای در پاسخ دهی برنامه در اولین درخواست برای هر صفحه بوحود آورد. ما میتوانیم این زمان پاسخدهی را با ایجاد T4 Template کاهش دهیم. T4 Template ها View های کامپایل شده آماده ای هستند که در زمان نیاز فقط اجرا میشوند.

 

  1. اجتناب از بازیابی فیلدهای غیر ضروری

تصور کنید جدول Customer  دارای بیست فیلد هست که ما فقط یه فیلد CustomerID, Name, Address آنرا احتیاج داریم

//کار اشتباه
var customer =
 (from cust in dataContext.Customers
 select cust).ToList();
 //کار درست
var customer =
 (from cust in dataContext.Customers
 select new {
 customer. CustomerID,
 customer.Name,
 customer.Address
 }). ToList (); 

 

  1. انتخاب مجموعه مناسب برای کار با داده ها

در Linq ما انواع مختلفی از مجموعه ها مانند Var, IEnumerable, IQueryable, IList برای کار با داده ها داریم. هر مجموعه اهمیت و تأثیر متفاوتی بر روی یک کوئری دارد، بنابراین در استفاده از این مجموعه ها برای کار با داده ها مختلف مراقب باشید.

 

  1. استفاده از کوئری های کامپایل شده درصورت نیاز

کوئری ها در Linq هر بار که برای اولین بار اجرا میشوند روندی را طی میکنند تا به دستورات SQL تبدیل شوند شما میتوانید با ایجاد کوئری های کامپایل شده سرعت اجرا کد را بالا ببرید. معمولا این کار را برای کوئری هایی انجام میدهند که بارها و بارها ممکن است در صفحه استفاده شوند ولی محتوای انها تغییر نمیکند مانند لیستی از شهرها و استان ها.

// ایجاد یک شی Entitty
NorthwindEntities mobjentity = new NorthwindEntities();
 //ایجاد یک کوئری
IQueryable lstCus = from customer in mobjentity.tblCustomers
where customer.City == "Delhi"
select customer;
 //کامپایل کردن کوئری
Func> compiledQuery
= CompiledQuery.Compile>(
(ctx, city) =>from customer in ctx.Customers
where customer.City == city
select customer); 

 
  1. بازیابی تعداد مورد نیاز از رکوردها

این مورد بیشتر در زمان صفحه بندی گریدها و لیست ها اتفاق می افتد. بهتر است هر باز همان تعداد رکوردی که برای نمایش یک صفحه از گرید لازم است را بازیابی کنیم. مثال زیر چگونی انجام این کار را نشان میدهد

// create the entity object
NorthwindEntities mobjentity = new NorthwindEntities();
int pageSize=10,startingPageIndex=2;
List lstCus = mobjentity.tblCustomers.Take(pageSize)
 .Skip(startingPageIndex * pageSize)
 .ToList(); 

 
  1. اجتناب از استفاده Contains

در Linq زمانی که از متد Contains استفاده میکنیم این متد تبدیل به شرط "WHRE IN" در SQL میشود که به شدت کارایی را پایین می آورد.

 

  1. عدم استفاده از View در Linq

Viewها در Linq به شدت کارایی کوئری را پایین می اورند بنابراین تا حد ممکن از استفاده از View در دستورات Linq  خودداری کنید.

 

  1. دیباگ و بهینه سازی کوئری های Linq

برای مشاهده نتایج و بهینه سازی کوئری های Linq میتوانید از ابزاری به نام LinqPad استفاده کنید. این ابزار برای ساخت پرس و جو ، اشکال زدایی و بهینه سازی بسیار مفید است.

منبع: https://www.dotnettricks.com


به اشتراک بگزارید:

نویسنده - شرکت آرشین پیشرو

. ویراستار شرکت آرشین پیشرو

نظر خود را درج کنید

نام شما