تا %60 درصد تخفیف برای تنها 4 نفر با کد 82J5Y05F + صدور گواهینامه فقط تا
000000

آموزش LINQ در سی شارپ :: قسمت 3 - ساختار کوئری های LINQ

بخش سوم آموزش LINQ رو با هم شروع میکنیم. در این بخش از سری مقالات آموزشی، درباره ساختار کوئری های LINQ و همچنین نحوه اجرای کوئری ها صحبت خواهیم گرد.مباحث این بخش به شرح زیر می باشند:

 

  1. ساختار کوئری های LINQ و اجزای تشکیل دهنده هر کوئری
  2. استفاده از ساختار کوئری و ساختار متد در نوشتن کوئری ها
  3. استفاده از Anonymous Types در نوشتن کوئری های LINQ
  4. آشنایی با مفهوم Deferred Query Execution (نحوه اجرای کوئر ها)


خوب، تو اولین مرحله می خواییم با ساختار و اجزای تشکیل دهنده یک کوئری آشنا بشیم. اگه بخواییم ساختار کلی یک کوئری LINQ رو نمایش بدیم، ساختار یک کوئری LINQ به صورت زیر می باشد:

from  in 
[query standard operators]
select 


همانطور که در بالا مشاهده میکنید کوئری های LINQ از بخش های مختلفی تشکیل شده اند. (قسمت هایی که داخل <> قرار گرفته توسط کاربر تعیین شده و اجباری می باشند و قسمت هایی که داخل [] قرار گرفته اند اختیاری می باشند، باقی اجزاء که داخل نشانه ای قرار نگرفته اند بخش های پیش فرض کوئری های LINQ هستند)

  1. from: تمامی کوئری های LINQ با کلمه کلیدی from آغاز می شوند. این کلمه نشان دهنده آغاز یک کوئری LINQ است.

 

  1. : این قسمت نمایش دهنده یکی از عناصر موجود در data source ایست که می خواهیم از آن کوئری بگیریم. انتخاب نام برای این قسمت آزاد است و می توان هر نامی را برای آن انتخاب کرد. برای مثال اگر لیستی داشته باشیم که عناصر موجود در آن از نوع int باشند، زمان اجرای کوئری element از نوع int در نظر گرفته خواهد شد.

 

  1. in: بخش بعدی یک کوئری LINQ کلمه کلیدی in است و نوشتن آن در تمام کوئری های LINQ اجباریست، بوسیله این کلمه که قبل از نام data_source می آید، تعیین می کنیم که کوئری بر روی کدام منبع داده باید اجرا شود.

 

  1. : در این بخش نام منبع داده ای که می خواهیم کوئری بر روی آن اجرا شود را می نویسیم.

 

  1. : این بخش حاوی تمامی operator های استاندارد LINQ است که برای عملیات فیل تر کردن اطلاعات، مرتب سازی، گروه بندی و یا ادغام از آنها استفاده می شوند. درباره اپراتور های استاندارد LINQ در بخش بعدی صحبت خواهیم کرد.

 

  1. select: این کلمه کلیدی بعد از بخش اپراتور های استاندارد می آید و نوشتن آن در تمام کوئری های LINQ اجباری است. این کلمه نشان دهنده به پایان رسیدن یک کوئری LINQ است و وظیفه انتخاب عناصر مورد نظر از منبع داده را دارد.

 

  1. : این قسمت نوع عناصر موجود در لیست ایجاد شده توسط کوئری را تعیین میکند، می توان نوع خروجی های کوئری را به طور دلخواه تعیین کرد.


برای درک بهتر هر یک از بخش های بالا با یک مثال جلو میریم:

int[] nums = { 4, 1, 7, 5, 9, 6, 2 };

var query = from n in nums
                  where n > 4
                  select n.ToString();

foreach (string s in query)
    Console.Write(s);


همانطور که گفته شد، کوئری با کلمه کلیدی from آغاز می شو، n در کوئری بالا نشان دهنده یکی از عناصر موجود در منبع داده است که از آن برای عملیات های فیل تر کردن استفاده می کنیم، بعد از n، کلمه کلیدی in و بعد از آن منبع داده مورد نظر است که در این کوئری منبع داده مورد نظر ما آرایه nums است. در بخش بعدی از اپراتور استاندارد where که برای فیل تر کردن اطلاعات استفاده می شود، استفاده کردیم، برای فیل تر سازی اطلاعات، از n که در خط اول کوئری تعریف کردیم استفاده کردیم، در خط بعدی هم بعد از کلمه کلیدی select نوع عناصر موجود در query را تعیین می کنیم. در اینجا با استفاده از متد ToString تعیین کردیم که عناصر موجود در کوئری از نوع string باشند. اگر به جای ()n.ToString، تنها n را می نوشتیم، عناصر موجود در لیست برگردانده شده توسط کوئری از نوع int در نظر گرفته می شد.

گرفتن کوئری از منابع داده به دو صورت امکان پذیر است.

  1. استفاده از کوئری های LINQ
  2. استفاده از متدهای کوئری و Lambda Expressions


در مورد روش اول در بخش های قبلی صحبت کردیم. در روش دوم از Extension Method هایی استفاده می کنیم که در net. نسخه 3.5 اضافه شده اند. استفاده از این Method ها برای نوشتن کوئری انعطاف پذیری بیشتری رو در نوشتن کوئری ها به ما میدن. نوشتن کوئری بالا با استفاده از متد های کوئری به صورت زیر است:

int[] nums = { 4, 1, 7, 5, 9, 6, 2 };
var query = nums.Where(n => n > 4).Select(n => n.ToString());

foreach (string s in query)
    Console.Write(s);


اما گفتیم که استفاده از متد ها در نوشتن کوئری انعطاف پذیری بیشتری دارند. یک نمونه از این انعطاف پذیری انتخاب ایندکس های دلخواه در کوئری گرفته شده است. برای مثال فرض کنیم بخواهیم در کوئری گرفته شده، فقط ایندکس های زوج را برگردانیم:

int[] nums = { 4, 1, 7, 5, 9, 6, 2 };
var query = nums.Where((n,index) => n > 4 && index % 2 == 0).Select(n => n.ToString());

foreach (string s in query)
    Console.Write(s);


پارامتر دومی که داخل متد where با نام index تعریف شده، نشان دهنده ایندکس مربوط به هر یک از عناصر نتیجه برگردانده شده از شرط قبل از شر index است. در ایجاد تمامی ایندکس های زوج برگردانده می شوند. متدهایی که در نوشتن کوئری استفاده می شوند پارامتر های ورودی دیگری نیز دارند که برای آشنایی با آنها می توانید از MSDN استفاده کنید. در بخش های بعدی مقاله با استفاده از این متدها بیشتر آشنا خواهیم شد.

اما امکان بعدی که در مورد آن می خواهیم بحث کنیم قابلیت استفاده از Anonymous Types در نوشتن کوئری ها است. همانطور که در بخش قبلی گفتیم Anonymous Types نوع هایی بی نام هستند که می توانند دارای یکیسری خصوصیات باشند. در کوئری های LINQ میتوانیم تعیین کنیم که خروجی ما از نوع Anonymous Types باشند. به مثال زیر توجه کنید، می خواهیم خروجی کوئری نوعی که تنها حاوی خصوصیت FullName است باشد، FullName از ترکیب خصوصیات FirstName و LastName در شئ Person تشکیل شده است (در کد زیر از کلاس Person که در بخش اول ایجاد کردیم استفاده می کنیم):

List persons = new List()
{
    new Person() { FirstName = "Ali", LastName = "Jamali", Age = 42 },
    new Person() { FirstName = "Hosein", LastName = "Ahmadi", Age = 23 },
    new Person() { FirstName = "Mohamamd", LastName = "Sadeghi", Age = 17 },
    new Person() { FirstName = "Reza", LastName = "Jamali", Age = 24 },
    new Person() { FirstName = "Nima", LastName = "Karami", Age = 18 }
};

var query = from p in persons
                 where p.Age > 20
                 select new { FullName = p.FirstName + " " + p.LastName };

foreach (var at in query)
{
    Console.WriteLine(at.FullName);
}


نوشتن کوئری بالا با استفاده از متدهای کوئری نیز امکان پذیر است:

....
var query = persons.Where(p => p.Age > 20)
                             .Select(n => new { FullName = n.FirstName + " " + n.LastName });
....


اما نحوه اجرای کوئری ها در LINQ به چه صورت است. وقتی شما داخل کد برنامه ای که نوشتید از کوئری LINQ استفاده کردید، هنگام اجرا، وقتی برنامه به کوئری LINQ می رسد، در اصل کوئری اجرا نمی شود، بلکه هنگامی کوئری اجرا می شود که از نتایج کوئری استفاده شود. در مثال های بالا کوئری های نوشته شده زمانی اجرا می شوند که برنامه به دستور foreach می رسد. به همین دلیل به اجرای کوئری های LINQ در زبان انگلیسی Deferred-Query-Execution یا اجرای کوئری با تاخیر نیز می گویند. البته می توان کوئری ها را در همان خطی که کوئری نوشته شده است اجرا کرد. این کار به استفاده از متد های ToList، ToArray، ToDictionary و ToLookup امکان پذیر است. این متد ها نتیجه کوئری را به یکی از مجموعه های List، Array، Dictionary و یا LookUp تبدیل می کنند. برای درک بهتر به مثال زیر دقت کنید:

List query = persons.Where(p => p.Age > 20).ToList();

foreach (var p in query)
{
    Console.WriteLine(p.ToString());
}


اگر بخواهیم کوئری بالا را با استفاده از دستورات LINQ بنویسیم باید به صورت زیر عمل کنیم:

List query = (from p in persons
                                 where p.Age > 20
                                 select p).ToList();


همانطور که مشاهده میکنید در کوئری بالا، بلافاصله نتیجه کوئری با استفاده از متد ToList داخل یک مجموعه List ریخته می شود و سپس با دستور foreach این لیست مورد پیمایش قرار می گیرد. دستور ToDictionary برای ایجاد یک Dictionary که حاوی یک کلید است استفاده می شود:

Dictionary<string, person=""> query = persons.Where(p => p.Age > 20).ToDictionary(n => n.FirstName);
Console.WriteLine(query["Hosein"].ToString());
</string,>


هر یک از مباحثی که در بالا عنوان شد، در نوشتن کوئری های قدرتمند LINQ نقش دارند. در بخش های بعدی مقالات، با استفاده از مثال های گوناگون به صورت جزئی تر با هر یک از این مباحث آشنا خواهید شد. در بخش بعدی در مورد اپراتورهای استاندارد LINQ صحبت خواهیم کرد.
#آموزش_linq

عنوان
1 آموزش LINQ در سی شارپ :: قسمت 1 - آشنایی با LINQ رایگان
2 آموزش LINQ در سی شارپ :: قسمت 2 - ویژگی های سی شارپ 3 رایگان
3 آموزش LINQ در سی شارپ :: قسمت 3 - ساختار کوئری های LINQ رایگان
4 آموزش LINQ در سی شارپ :: قسمت 4 - عملگرهای استاندارد (بخش اول) رایگان
5 آموزش LINQ در سی شارپ :: قسمت 5 - عملگرهای استاندارد (بخش دوم) رایگان
6 آموزش LINQ در سی شارپ :: قسمت 6 - عملگرهای استاندارد (بخش سوم) رایگان
7 آموزش LINQ در سی شارپ :: قسمت 7 - عملگرهای استاندارد (بخش چهارم) رایگان
زمان و قیمت کل 0″ 0
1 نظر
fardin_esmi

خیلی ممنون از آموزشهای مفید و سر راستی که گذاشتید.

تا حالا از منابع مختلفی آموزشهای مختلفی رو دیده بودم ولی آموزشهای شما با یادگیری من خیلی جوره

مرسی به خاطر زحمتی که می کشید

-----ویرایش----------

فقط اگه زحمتی نیست پایان هر مطلب لینک به مطلب قبل و بعد رو هم قرار بدید .

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر