اولین نکته مهم که باید به یاد داشته باشیم آن است که اینترفیس IQueryable از اینترفیس IEnumerable ارث بری کرده است. این بدان معناست هز کاری که اینترفیس IEnumerable میتواند انجام دهد اینترفیس  IQueryable نیز میتواند. تفاوت های زیادی بین بین این دو اینترفیس وجود دارد اما میخواهیم در مورد مهم ترین تفاوت آنها صبحت کنیم.

اینترفیس IEnumerable برای زمانی مفید است که رکوردهای شما توسط LINQ یا EntityFramework بارگذاری شده باشد و شما بخواهید که فیلتری را بر روی رکورد ها اعمال کنید. کد زیر را در نظر بگیرید که جدول کاربران را انتخاب کرده است و کاربرانی را که سن آنها بیشتر از 20 سال باشد را فیلتر میکند.

Entities db = new Entities();
IEnumerable<Users> users= db.Users; 
IEnumerable<Users> temp = users.Where(x => x.Age > 20).ToList();

در اینجا ابتدا لیست تمامی کاربران را از دیتابیس میخوانیم و سپس بر روی لیست دریافتی کاربرانی را که سن آنها بیشتر از 20 باشد را فیلتر را اعمال میکنیم. در واقع تمامی رکوردها از دیتابیس به سمت کلاینت ارسال شده و در آنجا فیلتر اعمال میگردد. اما در مثال پایین به جای IEnumerable از IQueryable استفاده میکنیم. با این کار ابتدا یک query در سمت سرور ایجاد میکینم و سپس query را به دیتابیس ارسال میکنیم و فقط کاربرانی را که سن آنها بیشتر از 20 باشد را از دیتابیس میخوانیم.

Entities db = new Entities();
IQueryable<Users> users= db.Users; 
IQueryable<Users> temp = users.Where(x => x.Age > 20).ToList();

بنابراین تفاوت مهم IQueryable و IEnumerable در جایی است که فیلتر اعمال میشود. در IEnumerable در سمت کلاینت و در IQueryable در سمت دیتابیس. بنابراین اگر شما میخواهید با لیستی از داده های in-memory کار کنید IEnumerable یک گزینه بسیار مفید است اما اگر شما میخواهید داده هایی را از دیتابیس بخوانید و فیلترهایی را بر روی آنها اعمال کنید IQuerable گزینه بهتر است زیرا باعث کاهش ترافیک شبکه و فقط داده هایی را که میخواهید از دیتابیس میخواند.

Powered by Froala Editor