با سلام
ما یه برنامه داریم که در تحت شبکه ی داخلی داره اجرا میشه
سرور یه 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 بستگی داره
اگه راه حلی واسه این کندی سرعت هست لطفا بگید
کوئری خود را به شکل زیر تغییر و دوباره امتحان کنید. لازم نیست کاربر را واکشی کنید تنها لازم است با استفاده از متد Any نام کاربری و رمز عبور کاربر را در بانک چک کنید:
var isSuccess = context.users.AsNoTracking().Any(c => c.username == username && c.password == password);
این کد رو هم تست میکنم نتیجه اش رو میگم حتما
اما به اطلاعات کاربری که وارد سیستم شده نیاز هست تو برنامه
سطوح دسترسی، نام و ... نیاز هستند
حتی اومدم فقط یک فیلد bit رو موقع احراز هویت select کردم اما بازم کند هستش!
آقای علیزاده
به نظر میاد مشکل از واکشی داده نباشه، چون بسته به CPU هر کامپیوتر عملیات لاگین زمان متفاوتی داره! مثلا کامپیوتر خودم در حد دو دهم ثانیه طول میشکه لاگین کنه، کامپیوتر هایی که پردازنده AMD قدیمی دارن حدود ۳۰ ثانیه طول میکشه! اما اگه از ADO.Net استفاده کنم این زمان به زمان یک پلک زدن تغییر میکنه حتی برای کامپیوترهای ضعیف تر
اگه فقط بحث واکشی داده بود که توی سرور جستجو میشه و نباید به مشخصات فنی کلاینت ها ارتباطی داشته باشه!
من حدس میزنم تنظیماتی رو توی Entity Context باید تغییر داد
من قطعه کد شما رو هم تست میکنم همینجا اعلام میکنم
ممنون ازتون
مواردی زیادی برای بهبود عملکرد 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
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)