مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

salman_b

عضویت از 1396/02/18

مشکل کند بودن عملیات لاگین شدن با استفاده از EF

  • پنجشنبه 10 اسفند 1396
  • 17:53
تشکر میکنم

با سلام
ما یه برنامه داریم که در تحت شبکه ی داخلی داره اجرا میشه

سرور یه static IP داره که از طریق اون به سرور وصل میشیم

این رو بگم که روی سرور هیچ سرویسی نوشته نشده

در برنامه ی کلاینت ها کوئری های Linq از سرور داده ها رو دریافت میکنند

زمانی که در برنامه ی کلاینت میخوایم لاگین کنیم میایم با استفاده از ورودی username و password رکوردی رو از دیتابیس انتخاب میکنیم اگر وجود داشت که کاربر لاگین میکنه و درغیر این صورت برنامه پیغام نامعتبر بودن ورودی صادر میکنه

مشکل اینجاست که وقتی کوئری ها با استفاده از Linq To Enitity نوشته میشن خیلی کند هستن و حدودا بسته به سرعت CPU کامپیوتر ها بین ۱ تا ۲۰ ثانیه طول میکشه تا لاگین شه!

اما همون کوئری رو با ADO میزنیم و خیلی خیلی سریع لاگین انجام میشه!

کد رو زیر می نویسم: در ضمن تمام مراحل در بلاک using هستش و درنهایت context آزاد میشه

context.users.AsNoTracking().Where(c => c.username == username && c.password == password).Select(c => c);

این اتفاق فقط در دفعه ی اول میفته، یعنی اگه طرف اشتباه وارد کنه و دفعه ی دوم صحیح وارد کنه خیلی سریع لاگین میشه، ولی خب سرعت همون دفعه ی اول خیلی مهمه که خیلی خیلی پایین هستش و بسته به CPU متغیره!

من خودم فکر میکنم عملیات MetaData Loading زمان بر هستش و روی سرعت تاثیر میذاره و از اونجایی که در برنامه کلاینت اتفاق میفته مستقیم به سرعت CPU بستگی داره

اگه راه حلی واسه این کندی سرعت هست لطفا بگید

پاسخ های این پرسش

تعداد پاسخ ها : 3 پاسخ
کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • پنجشنبه 10 اسفند 1396
  • 18:25

کوئری خود را به شکل زیر تغییر و دوباره امتحان کنید. لازم نیست کاربر را واکشی کنید تنها لازم است با استفاده از متد Any نام کاربری و رمز عبور کاربر را در بانک چک کنید:

var isSuccess = context.users.AsNoTracking().Any(c => c.username == username && c.password == password);

کاربر سایت

salman_b

عضویت از 1396/02/18

  • پنجشنبه 10 اسفند 1396
  • 19:44

این کد رو هم تست میکنم نتیجه اش رو میگم حتما

اما به اطلاعات کاربری که وارد سیستم شده نیاز هست تو برنامه

سطوح دسترسی، نام و ... نیاز هستند

حتی اومدم فقط یک فیلد bit رو موقع احراز هویت select کردم اما بازم کند هستش!

آقای علیزاده

به نظر میاد مشکل از واکشی داده نباشه، چون بسته به CPU هر کامپیوتر عملیات لاگین زمان متفاوتی داره! مثلا کامپیوتر خودم در حد دو دهم ثانیه طول میشکه لاگین کنه، کامپیوتر هایی که پردازنده AMD قدیمی دارن حدود ۳۰ ثانیه طول میکشه! اما اگه از ADO.Net استفاده کنم این زمان به زمان یک پلک زدن تغییر میکنه حتی برای کامپیوترهای ضعیف تر

اگه فقط بحث واکشی داده بود که توی سرور جستجو میشه و نباید به مشخصات فنی کلاینت ها ارتباطی داشته باشه!

من حدس میزنم تنظیماتی رو توی Entity Context باید تغییر داد

من قطعه کد شما رو هم تست میکنم همینجا اعلام میکنم

ممنون ازتون

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • جمعه 11 اسفند 1396
  • 12:34

مواردی زیادی برای بهبود عملکرد EF وجود دارد که خودش جای بحث دارد. بله سریع ترین روش دسترسی به داده استفاده از ADO.NET است، EF و بسیاری از ORM های دیگر به صورت داخلی از ADO.NET استفاده می کنند.

و چند پیشنهاد: 

اگر مسئله Performance برای شما بسیار مهم است میتوانید به NET Core. محاجرت کنید چون از Performance بسیار بالایی برخوردار است.

لینک های زیر به نکاتی برای بهبود عملکر ef اشاره می کنند:

c# - Improving Performance of an Entity Framework Query - Stack Overflow

entity framework - How to improve EF query performance with 20+ Includes() - Stack Overflow

.net - Entity Framework is Too Slow. What are my options? - Stack Overflow

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)