سلام خدمت شما .برای اینکه سوالات را به طور موثر بنویسید، باید درک کنید که همه ی متغیرها در یک عملکرد کامل query چگونه با یکدیگر در ارتباط هستند. اگر این روابط را درک کنید خیلی راحت تر متوجه نمونه های LINQ و مثال های کد در پرونده سازی می شوید. به علاوه متوجه خواهید شد که هنگامی که متغیرها به طور ضمنی با استفاده از var تایپ می شوند، پشت صحنه ها چه اتفاقی می افتد.
عملکردهای LINQ query به طور جدی در منبع داده، در خود query و در اجرای query تایپ می شوند. نوع متغیرها در query باید با نوع عناصر در منبع داده و با نوع تکرار داده در وضعیت foreach سازگار باشد. این تایپ جدی تضمین می کند که خطاها در زمان کامپایل گرفته می شوند، وقتی که قبل از مواجه شدن یوزرها با آنها می توانند تصحیح شوند.
برای توضیح اینگونه روابط، اکثر مثال های بعدی از نوع ضمنی برای همه ی متغیرها استفاده می کنند. آخرین مثال نشان می دهد که هنگامی که با استفاده از var از تایپ ضمنی استفاده می کنید، چگونه همان اصول به کار گرفته می شوند.
Query هایی که منبع داده را تبدیل نمی کنند:
مثال زیر یک LINQ به عملکرد آبجکت های query را نشان می دهد که هیچگونه تغییری روی داده اجرا نمی کند. منبع حاوی توالی رشته ها است و خروجی query نیز یک توالی از رشته ها می باشد.
۱٫ نوع استدلال منبع داده، نوع متغیر محدوده را تعیین می کند.
۲٫ نوع آبجکت انتخاب شده، نوع متغیر query را تعیین می کند. در اینجا نام یک رشته می باشد. بنابراین متغیر query یک IEnumerable می باشد.
۳٫ متغیر query روی وضعیت foreach تکرار می شود. از آنجایی که متغیر query یک توالی از رشته ها می باشد، تکرار متغیر نیز یک رشته می باشد.
Query هایی که منبع داده را تغییر می دهند:
توضیح زیر یک LINQ به عملکرد SQL query را نشان می دهد که یک تبدیل ساده روی داده را اجرا می کند. Query یک ترتیبی از آبجکت های مشتری (customer) را به عنوان ورودی می گیرد و پراپرتی Name را در نتیجه انتخاب می کند. از آنجایی که Name یک رشته می باشد، query یک توالی از رشته ها را به عنوان خروجی تولید می کند.
۱٫ نوع استدلال منبع داده نوع متغیر دامنه را تعیین می کند.
۲٫ عبارت select، به جای آبجکت Customer، پراپرتی Name را گزارش می دهد. از آنجایی که Name یک رشته می باشد، نوع استدلال custNameQuery یک رشته می باشد و نه یک Customer.
۳٫ از آنجایی که custNameQuery یک توالی از رشته ها می باشد، تکرار متغیر لوپ foreach نیز باید یک رشته (string) باشد.
توضیح زیر یک تبدیل پیچیده تر را نشان می دهد. وضعیت select یک نوع بی نام را گزارش می دهد که تنها دو عضو از آبجکت Customer (مشتری) اصلی را می گیرد.
۱٫ نوع استدلال منبع داده همیشه نوع متغیر محدوده در query می باشد.
۲٫ از آنجایی که عبارت select یک نوع بدون نام را تولید می کند، متغیر query باید با استفاده از var به طور ضمنی تایپ شده باشد.
۳٫ از آنجایی که نوع متغیر query ضمنی می باشد، تکرار متغیر در لوپ foreach نیز باید ضمنی باشد.
اجازه به کامپایلر برای اشاره به نوع اطلاعات
گرچه باید نوع روابط در یک عملکرد query را درک کنید، شما گزینه ای دارید که به کامپایلر اجازه می دهید همه ی این کارها را برای شما انجام دهد. لغت کلیدی var می تواند برای هر متغیر داخلی در یک عملکرد query استفاده شود. توضیح زیر مشابه مثال شماره ی ۲ می باشد که قبلا مورد بحث قرار گرفت. به هرحال کامپایلر یک نوع قدرتمند برای هر متغیر در عملکرد query ارائه می دهد.