مقایسه IEnumerable و IQueryable

مقدمه
در Query های LINQ برای دسترسی به داده های بانک اطلاعاتی یا مجموعه ها، از IQueryable و IEnumerable استفاده می شود. اینترفیس IQueryable اینترفیس IEnumerable را به ارث برده است. هر دو برای دسترسی به داده ها و کار با آنها مهم و پر کاربرد هستند. در ادامه امکانات هر دو و راهکارهای بالا بردن کارایی استفاده از هر کدام را بررسی می کنیم.

آشنایی با IEnumerable

  • IEnumerable در فضای نام System.Collections قرار دارد
  • در IEnumerable فقط می توان به سمت جلو حرکت کرد. نمی توان به سمت عقب یا بین آیتمها حرکت کرد.
  • IEnumerable بهترین انتخاب برای query گرفتن از داده های ذخیره شده در مجموعه های موجود در حافظه مانند List و Array است.
  • وقتی یک query روی بانک اطلاعاتی انجام می شود، IEnumerable ابتدا آن query را سمت Server اجرا کرده، داده ها را در سمت کلاینت در حافظه بارگذاری و سپس آنها را فیلتر می کند.
  • IEnumerable برای استفاده در query های Linq2Object و Linq2Xml مناسب است.
  • IEnumerable از امکان Deferred Execution پشتیبانی می کند (بدین معنی که query تا زمان اولین درخواست بصورت یک عبارت در حافظه نگهداری می شود)
  • IEnumerable از Custom Query ها پشتیبانی نمی کند.
  • IEnumerable از بارگذاری دیرهنگام (Lazy Loading) پشتیبانی نمی کند بنابراین برای سناریوهایی مانند صفحه بندی مناسب نیست.


مثال از کاربرد IEnumerable:

MyDataContext dc = new MyDataContext ();
IEnumerable<Employee> list = dc.Employees.Where(p => p.Name.StartsWith("S"));
list = list.Take<Employee>(10);

عبارت SQL متناظر با مثال بالا برابر است با:

SELECT [t0].[EmpID], [t0].[EmpName], [t0].[Salary]
FROM [Employee] AS [t0]
WHERE [t0].[EmpName] LIKE @p0

توجه داشته باشید که عمل فیلتر کردن (۱۰ آیتم آخر) در سمت کلاینت انجام می شود و معادل آن SQL تولید نشده است.

آشنایی با IQueryable

  • IQueryable در فضای نام System.Linq قرار دارد.
  • در IQueryable فقط می توان به سمت جلو حرکت کرد. نمی توان به سمت عقب یا بین آیتمها حرکت کرد.
  • IQueryable بهترین انتخاب برای کار با مجموعه های خارج از حافظه مانند بانکهای اطلاعاتی و سرویس هاست.
  • وقتی یک query روی یک بانک اطلاعاتی اجرا شود، IQueryable دستور select آن را به همراه همه فیلترها در سرور اجرا می کند.
  • IQeryable برای query های Linq 2 SQL مناسب است.
  • IQeryable از امکان Deferred Execution پشتیبانی می کند.
  • IQueryable از Custom Query ها با استفاده از متدهای CreateQuery و Execute پشتیبانی می کند.
  • IQueryable از بارگذاری دیرهنگام پشتیبانی می کند بنابراین برای سناریوهایی مانند صفحه بندی مناسب است.


مثال از کاربرد IQueryable:

MyDataContext dc = new MyDataContext ();
IQueryable<Employee> list = dc.Employees.Where(p => p.Name.StartsWith("S"));
list = list.Take<Employee>(10);

عبارت SQL متناظر با مثال بالا برابر است با:

SELECT TOP 10 [t0].[EmpID], [t0].[EmpName], [t0].[Salary]
FROM [Employee] AS [t0]
WHERE [t0].[EmpName] LIKE @p0

منبع:

آشنایی با Generic Handler در ASP.NET

حتما برای شما هم پیش آمده است که در حین ساخت وب سایت بخواهید صفحه را بصورت پویا بسازید، در این موارد نیازی به ساخت فرم وب نیست و بجای آن می توانید از Generic handler یا فایلهای ASHX استفاده کنید. هر کاری که باید انجام شود در یک فایل ashx نوشته می شود. با فراخوانی url فایل ashx کار مورد نظر انجام شده و محتوای مورد نیاز تولید می شود.
برای آشنایی با نحوه ساخت Generic Handler ها مراحل زیر را انجام دهید:

  • یک پروژه از نوع ASP.NET بسازید. منوی Add-> New Item را انتخاب کنید تا پنجره Add New item نمایش داده شود. آیتم Generic Handler را انتخاب کنید و نام آن را وارد نمایید (در این مثال نام آن MyHandler انتخاب شده است). پس از انتخاب کلید Add فایل MyHandler.ashx به پروژه شما اضافه خواهد شد.

 

  • همانطور که در کد مشاهده می کنید، کلاس MyHandler اینترفیس IHttpHandler را پیاده سازی کرده است. مهمترین عضو آن متد ProcessRequest است که بطور پیش فرض در کد پیاده سازی شده است. هر زمان که تقاضایی برای فایل ashx موجود باشد این متد اجرا خواهد شد. در این مثال با رسیدن تقاضا برای MyHandler.ashx یک تصویر نمایش داده خواهد شد. برای این کار ابتدا فایل تصویر مورد نظر را در پروژه اضافه نمایید. سپس کد زیر را در متد ProcessRequest بنویسید:
public void ProcessRequest(HttpContext context)
{
      context.Response.ContentType = "image/jpg";
      context.Response.WriteFile("~/Ferrari.jpg");
}

در این متد ابتدا نوع محتوایی که تولید و ارسال خواهد شد تعریف شده است و سپس با استفاده از متد WriteFile فایل تصویر مورد نظر به عنوان محتوا ارسال شده است. برای دیدن نتیجه این کد پروژه را اجرا کرده و سپس در قسمت آدرس مرورگر فایل MyHandler.ashx را درخواست نمایید.

  • در ادامه این مثال را بسط خواهیم داد و آن را کاربردی تر خواهیم کرد. در مثال جدید یک پارامتر را با استفاده از QueryString به فایل ashx ارسال می کنیم و بر اساس آن تصمیم گیری خواهیم کرد که تصویر یک فراری نمایش داده شود یا یک لامبورگینی هرچند که در هر شرایطی من فراری را ترجیح می دهم!
    متد ProcessRequest را به شکل زیر تغییر دهید:
        public void ProcessRequest(HttpContext context)
        {
            HttpResponse response = context.Response;
            response.ContentType = "image/jpg";
            string carType = context.Request.QueryString["cartype"];
 
            if(carType=="Ferrari")
                response.WriteFile("~/Ferrari.jpg");
            else
                response.WriteFile("~/Lamborgini.jpg");
        }

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


دلایل استفاده از Generic Handler به جای Web Form

  1. سادگی  استفاده: Generic Handlerها ساختار ساده ای دارند و برنامه نویس را با تعداد زیادی رویداد و متد درگیر نمی کنند. Web Form ها از کلاس Page ارث بری دارند بنابراین تعداد زیادی از اعضای Page را به ارث می برند که برای بسیاری از کارها به آنها نیازی ندارید.
  2. کارایی: اجرای بیش از ده رویداد در زمان مدیریت تقاضای یک Web Form در مقابل اجرای فقط یک رویداد در زمان تقاضای Generic Handler ها، باعث افزایش کارایی فایلهای ashx شده است.


نحوه انتخاب Web Form یا Generic Handler
شما باید Web Form ها را انتخاب کنید اگر:

  • می خواهید صفحات ساده html طراحی کنید
  • می خواهید از کنترلهای سفارشی ASP.NET استفاده کنید
  • می خواهید صفحات پویا طراحی کنید

 

شما باید Generic Handler ها را انتخاب کنید اگر:

  • می خواهید با فایلهای باینری کنید (به عنوان مثال با فایلهای تصویری)
  • می خواهید با XML کار کنید (به عنوان مثال با Rss ها)
  • کارایی صفحات وب برای شما بسیار اهمیت دارد و می خواهید صفحات وب مینیمال طراحی کنید.

برخی کاربردهای رایج Generic Handler

  • ساختن Rss Feed برای سایت
  • ساختن تصاویر در اندازه مورد نیاز و ارسال آن برای تقاضا کننده
  • ساخت تصاویر امنیتی (captcha)
  • نمایش متنهای طولانی ذخیره شده در بانک اطلاعاتی
  • تبدیل متون به PDF

 

منابع برای مطالعه بیشتر: