آموزش IEnumerable و IQueryable در EF Core

در این آموزش قصد داریم به یکی از مباحث مهم و پایه‌ای در توسعه برنامه‌های مبتنی بر Entity Framework Core در Asp.Net Core بپردازیم. تفاوت بین IEnumerable و IQueryable. این دو رابط کاربردی به ظاهر مشابه هستند، اما تفاوت‌های اساسی‌ای در شیوه اجرا و تاثیر آن‌ها بر عملکرد برنامه دارند. در دنیای برنامه‌نویسی با EF Core، کار با دیتابیس از طریق LINQ انجام می‌شود. اما اینکه یک کوئری به صورت IEnumerable یا IQueryable باشد، تفاوت زیادی در نحوه‌ی اجرای آن، مصرف حافظه، و سرعت دارد.

اینکه یک کوئری به صورت IEnumerable یا IQueryable باشد، تفاوت زیادی در نحوه‌ی اجرای آن، مصرف حافظه، و سرعت دارد.

IEnumerable چیست؟

IEnumerable از فضای نام System.Collections.Generic است. برای پیمایش مجموعه‌هایی استفاده می‌شود که در حافظه قرار دارند. اجرای کوئری به صورت in-memory (در حافظه) انجام می‌شود. مناسب برای زمانی است که داده‌ها قبلاً از دیتابیس بارگذاری شده‌اند.

var users = context.Users.ToList(); // اجرای کوئری در همین لحظه
var filtered = users.Where(u => u.Age > 25); // فیلتر در حافظه انجام می‌شود

IQueryable چیست؟

IQueryable از فضای نام System.Linq است. نماینده‌ای از یک کوئری است که روی منبع داده‌ای قابل query شدن (مثل دیتابیس) اجرا می‌شود. اجرای کوئری به صورت deferred execution است. EF Core این کوئری را به SQL تبدیل و در سرور اجرا می‌کند.

var filtered = context.Users.Where(u => u.Age > 25); // هنوز اجرا نشده
var list = filtered.ToList(); // اجرای کوئری اینجا اتفاق می‌افتد

هدف اصلی از استفاده‌ی IQueryable و IEnumerable این است که تا حد امکان پردازش‌ها در سمت دیتابیس و از طریق IQueryable انجام شود، نه در حافظه برنامه با استفاده از IEnumerable. این رویکرد باعث بهینه‌سازی سرعت، کاهش مصرف حافظه و افزایش عملکرد کلی برنامه می‌شود.

تفاوت‌های اصلی بین IEnumerable و IQueryable

ویژگیIEnumerableIQueryable
اجرادر حافظه (Client Side)در دیتابیس (Server Side)
زمان اجرابلافاصله بعد از ToListزمانی که نیاز باشد – deferred
ترجمه به SQLخیربله
عملکردکندتر در داده‌های بزرگبهینه‌تر
مناسب برایکوئری‌های ساده و داده‌های موجودکوئری‌های پیچیده و فیلتر در دیتابیس

خطاهای رایج

بسیاری از توسعه‌دهندگان تازه‌کار در EF Core ابتدا از ToList استفاده می‌کنند، سپس با Where فیلتر می‌کنند. این یعنی تمام داده‌ها از دیتابیس بارگیری می‌شود و فیلتر در حافظه انجام می‌شود. این کار در داده‌های بزرگ منجر به کاهش شدید عملکرد می‌شود.

❌ استفاده نادرست

var users = context.Users.ToList().Where(u => u.IsActive);

✅ استفاده درست

var users = context.Users.Where(u => u.IsActive).ToList();

استفاده ترکیبی از IQueryable و IEnumerable

در برخی موارد نیاز است بخشی از کوئری در دیتابیس اجرا شود و بخشی در حافظه. استفاده از AsEnumerable باعث می‌شود بخش دوم دیگر به SQL تبدیل نشود.

var query = context.Users.Where(u => u.IsActive); // IQueryable
var users = query.AsEnumerable().Where(u => SomeCustomFunction(u)); // IEnumerable

یک مثال از استفاده ترکیبی از IQueryable و IEnumerable: فرض کنید. در یک سایت فروشگاهی، کاربران می‌تونن لیست محصولات رو بر اساس دسته‌بندی و قیمت فیلتر کنن. این فیلترها مستقیماً به دیتابیس منتقل می‌شن (یعنی IQueryable) و SQL برای انتخاب محصولات اجرا می‌شه. اما بعد از واکشی، می‌خوای قیمت نهایی هر محصول رو بر اساس یک الگوریتم پیچیده‌ی تخفیف‌دهی حساب کنی. مثلاً تخفیف براساس نوع کاربر، مناسبت روز، موجودی انبار و غیره — که این الگوریتم در C# نوشته شده و قابل ترجمه به SQL نیست.

سخن پایانی

  • از IQueryable برای کوئری‌های اصلی روی دیتابیس استفاده شود.
  • از IEnumerable زمانی استفاده شود که نیاز به پردازش در حافظه یا استفاده از توابع .NET داریم.
  • اشتباه در انتخاب می‌تواند منجر به کاهش عملکرد و مصرف زیاد حافظه شود.

مشاهده در آپارات یا یوتیوب

محتوای ویدیویی این صفحه در سایت قابل مشاهده است. اما اگر عادت دارید توی پلتفرم آپارات یا یوتیوب ویدیوها را مشاهده کنید، می‌توانید از دکمه‌های زیر استفاده کنید.

تماشای ویدیوی آموزش IEnumerable و IQueryable در EF Core در آپارات و یوتیوب

اشتراک‌گذاری با یک کلیک

با یک کلیک، محتوای این صفحه را در شبکه‌های اجتماعی، ایمیل یا پیام‌رسان‌های مورد علاقه‌تان به‌سرعت به اشتراک بگذارید.

اشتراک‌گذاری صفحه آموزش IEnumerable و IQueryable در EF Core در شبکه‌های اجتماعی

نظرات شما برای ما ارزشمند است

متاسفانه تاکنون پیامی برای این مطلب ثبت نشده است. شما اولین شخصی باشید که پیام می‌گذارد.

نظرات کاربران

فرم افزودن دیدگاه

با ارسال نظرات خود ما را در ایجاد محتوای بهتر کمک کنید.

با خدمات تهران آی تی آشنا شوید

تهران آی تی با افتخار خدمات زیر را ارائه می‌دهد.