مشخصات مقاله
-
1315
-
0.0
-
2836
-
0
-
0
آموزش رابطه انواع داده ای در کوئری های LINQ
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.
رابطه ی انواع داده ای در کوئری های LINQ
به منظور تنظیم بهینه ی یک Query (نوشتن یک کوئری کارامد به روش بهینه)، بایستی ارتباطی که نوع های داده ای متغیرها در عملیات مربوط به یک کوئری با هم دارند را به خوبی درک کنید. با فهم رابطه ی بین نوع داده ای متغیر ها در عملیات کوئری، نمونه کدهای LINQ را در مستندات آن بهتر درک می کنید. علاوه بر آن زمانی که متغیرها را به صورت ضمنی و با استفاده از کلیدواژه ی var نوع دهی و اعلان می کنید، درک اینکه پشت صحنه چه اتفاقی رخ می دهد برای شما آسان تر خواهد شد.
عملیات مربوط به کوئری های LINQ، در منبع داده، در خود کوئری و نیز در اجرای کوئری به طور صریح نوع دهی می شوند. نوع متغیرهای تعریف شده در کوئری، بایستی با نوع المان های موجود در منبع داده و نیز نوع متغیر اعلان شده در دستور foreach (که به آن iteration variable) سازگار باشد. این نوع دهی صریح (strong typing) سبب می شود نوع خطاها در زمان ترجمه (compile-time) به راحتی قابل catch (مدیریت) شده و پیش از اینکه کاربران با آن مواجه شوند، این خطاها را تصحیح کرد.
جهت نمایش رابطه ی بین نوع داده ای متغیرها، بیشتر مثال هایی که ارائه می کنیم از explicit typing برای نوع دهی صریح (تمامی متغیرها) استفاده می کنند.
کوئری هایی که طی عملیات هیچ تبدیلی را روی داده های data source اجرا نمی کنند
تصویر زیر یک عملیات LINQ to Objects را به نمایش می گذارد که هیچ تبدیلی را روی داده ها انجام نمی دهد. منبع داده دربردارنده ی دنباله یا مجموعه ای از رشته ها است و همان طور که مشاهده می کنید خروجی کوئری نیز یک دنباله از رشته ها است.
1. آرگومان تعیین کننده ی نوع (در این مثال string) در منبع داده، همچنین نوع متغیر name (متغیری که برای دسترسی به المان های لیست names بکار می رود) را تعیین می کند.
2. نوع شی انتخابی (name) همچنین نوع متغیر nameQuery (متغیری که عبارت کوئری در آن ذخیره می شود) را مشخص کرده است. بنابراین، متغیری که دستور کوئری در آن ریخته می شود (nameQuery)، یک IEnumerable<string> می باشد.
3. با استفاده از حلقه ی foreach بر روی متغیر nameQuery چرخیده (داخل آن حلقه زده) و از آنجایی که متغیر ذکر شده یک دنباله از رشته ها می باشد، متغیری که داخل دستور foreach تعریف می شود نیز از نوع string می باشد.
کوئری هایی که منبع داده را تبدیل می کند
تصویر زیر عملیات LINQ to SQL که یک تبدیل ساده را بر روی داده ها انجام می دهد را به نمایش می گذارد. کوئری مورد نظر یک دنباله از اشیا Customer به عنوان ورودی پذیرفته، اما تنها پراپرتی Name را از شی مزبور (در نتیجه) انتخاب می کند. به این خاطر که Name یک رشته است، کوئری یک دنباله از رشته ها را به عنوان خروجی برمی گرداند.
1. آرگومانی که نوع منبع داده را مشخص می کند (در این مثال Customer)، نوع متغیر تعریف شده در عبارت کوئری (cust) را نیز مشخص می کند.
2. دستور select بجای کل شی Customer یک پراپرتی Name را از شی مزبور برمی گرداند.
3. از آنجایی که custNameQuery یک دنباله از مقادیر رشته ای است، متغیر تعریف شده در دستور حلقه ی foreach (در این مثال str) نیز بایستی از نوع رشته (string) باشد.
تصویر زیر یک تبدیل پیچیده تر را نسبت به نمونه ی قبلی نمایش می دهد. در این مثال، دستور select یک نوع ناشناس (anonymous type) را برمی گرداند که تنها دو عضو از شی Customer را نمایش می دهد.
1. آرگومانی که نوع منبع داده را مشخص می کند، همیشه از همان نوع متغیر تعریف شده در دستور کوئری می باشد.
2. از آنجایی که دستور select یک نوع ناشناس (anonymous type) تولید می کند، نوع متغیری که دستور کوئری در آن ذخیره می شود بایستی با var تعریف شود.
3. به این خاطر که نوع متغیر کوئری ضمنی (ناشناس) است، متغیر اعلان شده در حلقه ی foreach نیز می بایست با var تعریف شود.
محول کردن وظیفه ی تشخیص نوع متغیر به کامپایلر
اگرچه شما به عنوان برنامه نویس می بایست با رابطه ی بین نوع متغیرهای موجود در یک عملیات کوئری آشنا باشید، اما این امکان هم برای شما وجود دارد که این وظیفه را به کامپایلر محول نمایید. کلیدواژه ی var را می توان برای تعریف هر متغیر محلی در عملیات کوئری مورد نظر بکار برد. تصویر زیر عملیاتی مشابه عمیات مثال دوم را نمایش می دهد، اما در این عملیات کامپایلر تک تک متغیرها را به طور صریح نوع دهی می کند.