علیرضا علی‌مردان
علیرضا علی‌مردان
خواندن ۲ دقیقه·۲ سال پیش

تفاوت IEnumerable با IQueryable

قطعا زمانهایی برای شما هم پیش آماده که بین استفاده این دو گزینه گیج شده باشید و بخواهید تفاوت بین آنها را بدانید. بهترین راه برای تصمیم گیری این است که بدانید هریک از این دو گزینه چه کاری انجام میدهند و برای چه سناریویی کارایی بهتری دارند.

رابط (interface) که در فضای‌نام System.Collection است، متمرکز به جستجو در داده‌های in-Memory است، درحالیکه IQueryable برای واکشی داده‌ها از منابع خارج از حافظه(out-Memory) مثل پایگاه‌داده، فایلها، سرویسها و ... است.

در سناریو مربوط به واکشی داده از پایگاه داده‌ای مثل sql بهترین توضیح میتواند عکس زیر باشد.

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

همانطور که مشاهده میکنید در کد فرضی :

EmpEntities ent = new EmpEntities(); IEnumerable<Employee> emp = ent.Employees; IEnumerable<Employee> temp = emp.Where(x => x.Empid == 2).ToList<Employee>();

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

واکشی داده با استفاده از Queryable
واکشی داده با استفاده از Queryable

نمونه کد برای حالت فوق:

EmpEntities ent = new EmpEntities(); IQueryable<Employee> emp = ent.Employees; IQueryable<Employee> temp = emp.Where(x => x.Empid == 2).ToList<Employee>();


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

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

استفاده از IEnumerable سربار سمت سرور را کاهش میدهد اما بخاطر انتقال تمام داده به کلاینت پهنای باند بیشتری نیاز دارد و حافظه بیشتر از کلاینت را مشغول خواهد نمود.

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