سلام
اول بگم که این مقاله برداشت آزاد و همچنین ترجمه ای از یک مقاله سایت مدیوم است با این لینک :
خب، فرض کنیم که میخوایم یه کتاب از کتابخانه شهر به امانت بگیریم. این کتاب اسمش مثلا دنیای شیرین دریا هست و تو ردیف دوم گذاشته شده و دارای جلد سخت سیاهرنگ هست. همچنین فرض میکنیم متصدی کتابخونه زبون ما رو متوجه نمیشه و فقط به زبون انگلیسی صحبت میکنه. اگه تو این حالت به زبون فارسی بهش بگیم: لطفا کتاب دنیای شیرین دریا رو برام بیارین این متصدی بیچاره تنها کاری که میتونه بکنه اینه که تمام کتابها رو بیاره تا ما بتونیم کتاب دلخواهمون رو برداریم. نهایتا مجبوریم تو کل کتابهای آورده شده بگردیم تا کتابمون رو پیدا کنیم. پیدا میشه ولی با صرف زمان و انرژی بیشتر. درسته؟
اما اگه متصدی کتابخونه زبون فارسی رو بلد بود یا ما زبون انگلیسی رو بلد بودیم چی؟ کافی بود به یه زبون مشترک بهش بگیم لطفا اون کتاب جلد سیاهه که تو ردیف دوم گذاشته رو برای من بیار و بلافاصله همون کتاب رو مستقیم برامون میاورد.
مشابه همین مساله، زمان کار کردن با دیتابیس های حجیم و حجم عظیمی از داده ها میتونه برامون اتفاق بیفته که دقیقا به همین صورت باعث میشه زمان و انرژی بیشتری برای یه کار مشابه صرف بشه.
هر دوی IEnumerable و IQueryable اینترفیس هایی هستن که زمان دستکاری داده ها و کار با دیتابیس و کالکشن ها استفاده میشن و توی LINQ یا همون Language-Integrated Query بسیار پرکاربرد هستن.
جهت آشنایی بیشتر با تکنولوژی LINQ میتونید این لینک ها رو ببینید :
اینترفیس IQueryable خودش فرزند IEnumerable هست و از اون ارث بری کرده، یعنی تمام ویژگی ها و کارایی های IEnumerable رو هم با خودش داره.
در زمان کار با دیتابیس، اینترفیس IQueryable یه مزیت بسیار بسیار مهم داره که اگر بخوایم مثل مثال بالا بیان کنیم توانایی این هست که به زبون کتابخونه دار بهش بگه دقیقا کدوم کتاب رو میخواد و لذا در زمان و انرژی صرفه جویی زیادی کنه.
به زبون فنی تر، اینترفیس IQueryable یه کوئری از نوع SQL ایجاد میکنه که سمت خود سی شارپ (یا دات نت یا دات نت کور) تولید میشه و به سمت دیتابیس ارسال میشه و فقط جواب فیلتر شده مورد نیاز ما رو برمیگردونه (مثلا فقط کتاب دنیای شیرین دریا). بعنوان مثال فرض کنیم میخوایم به متصدی بگیم که کتابی که جلدش مشکیه و دارای جلد سخت هست رو برام بیار. تو دات نت با فرض استفاده از کانتکست یه همچین کدی باید بنویسیم:
IQueryable<Book> Book = _context.Books .Where(q => q.Color == 'Black' && q.cover == 'Hardback');
و این کد به صورت زیر به زبان SQL تفسیر میشه :
SELECT * FROM Books AS [q] WHERE [q].[Color] == 'Black' AND [q].[Cover] == 'Hardback'
از طرف دیگه، اگر کتابخونه دار زبون ما رو متوجه نشه و بهش بگیم کتاب دنیای شیرین دریا رو برام بیار، میره و تمام کتابها رو میاره و ما خودمون باید اون رو پیدا کنیم و برداریم. اینترفیس IEnumerable هم همچین کاری میکنه. یعنی تمام کتابها رو از دیتابیس میاره و بعد تو اونها میگرده تا کتاب مدنظر رو پیدا کنه که تو دات نت کدش اینجوری میشه:
IEnumarable<Book> Book = _context.Books .AsEnumerable() .(q => q.Color == 'Black' && q.cover == 'Hardback');
و این کد به صورت زیر به زبان SQL تفسیر میشه :
SELECT * FROM Books AS [q]
تو این مقاله دیدیم که تفاوت عمده این دوتا اینترفیس تو محلی هست که فیلتر اتفاق میفته. تو IQueryable فیلتر در سمت دیتابیس اتفاق میفته و دیتای فیلتر شده بازگشت داده میشه. اما تو IEnumerable فیلتر در سمت دات نت و/یا سی شارپ اتفاق میفته که باعث میشه لیست کل داده ها رو از دیتابیس واکشی کنیم و سپس داخلش سرچ کنیم. اینترفیس IEnumerable بیشتر در زمان کار با دیتاهای درون مموری مثل آرایه ها و لیست ها کاربرد داره. اینترفیس IQueryable هم بیشتر در زمان کار با دیتابیس کاربرد داره که کمک میکنه دیتامون رو بصورت فیلتر شده برگردونیم.