خیلی اوقات میشنویم که Dapper خیلی سریعتر از EF هست و توصیه میشه در کوئریهای پیچیده و بزرگ از Dapper استفاده بشه.
ولی بهتر هست قبل از کوچ کردن اول بررسی بین این دو داشته باشیم.
- Dapper یک Mini ORM هست در حالیکه EF یک Full ORM محسوب میشه
- Dapper به شکل آبجکتهای POCO تولید خروجی نمیکند در حالیکه EF به شکل POCO تولید آبجکت میکند.
- در EF ما ویژگیهایی مثل UnitOfWork داریم که یکی از وطایف آن Tracking Changes هست بدین معنی که شما وقتی یک آبجکت را از دیتابیس فراخوانی میکنید و سپس مقدار یکی از فیلدهای این آبجکت را تغییر میدهید، با گزینه SaveChanges() آن آبجکت را در دیتابیس ذخیره میکنید. اما این ویژگی در Dapper وجود ندارد.
- در EF چون آبجکتها در فراخوانی بار اول در Cache ذخیره میشوند به همین خاطر کندتر هستند اما در فراخوانی بار بعدی دیتا به جای دیتابیس از Cache فراخوانی میشود.
- سرعت Dapper در دریافت اطلاعات مشابه به ADO.NET و در برخی موارد سریعتر از آن است اما EF بدین شکل نیست.
پیشنهاد:
اگر ترجیح میدین که فقط از EF استفاده کنید، برای کوئریهای سنگین (عموماً Selectها) میشه از این روش استفاده کرد:
string query = @"SELECT TOP 1 * FROM commaon.Source_Acc WHERE (UserName = @userName) AND (Password = @password) AND (active = 1)"; SqlParameter usernam_param = new SqlParameter("@userName", UserName); SqlParameter pass_param = new SqlParameter("@password", Pass); data = DC.Source_Acc.SqlQuery(query, usernam_param, pass_param).AsNoTracking().First();
در اینجا کلمه کلیدی AsNoTracking()
هست که باعث میشه context آبجکت درخواستی را Track نکند (وارد Cache نکند). در این حالت افزایش سرعت دریافت اطلاعات را داریم.
در روش دیگه میشه ترتیبی در نظر گرفت که موارد SELECT فقط با Dapper و مواردی مثل INSERT، UPDATE، DELETE توسط EF انجام شود.