چندین مثال از LINQ

حال که شما با مفاهیم پایه ای پرس و جو با LINQ و نحوه استفاده از عبارات select، filter و order آشنا شدید، اجازه دهید که نگاهی به چندین مثال بیندازیم که در آنها از عبارات فوق به صورت ترکیبی استفاده شده است. این مثال ها به شما اجازه می دهند که بیشتر با تکنیک های استفاده از LINQ آشنا شوید.

var query1 = from    p in people
             orderby p.LastName
             where   p.Age >= 18
             select new { p.FirstName, LN = p.LastName };
var query1 = people.OrderBy(p => p.LastName).Where(p => p.Age >= 18)
                   .Select (p => new { p.FirstName, LN = p.LastName });

عبارات پرس و جوی بالا معادل هم هستند و هر دو ترکیبی از انتخاب، فیلتر و مرتب کردن نتایج را نشان می دهند. به این نکته توجه کنید که در نسخه دوم مثال بالا ، ما از متدهای خود LINQ استفاده کرده ایم. عملگر نقطه (.) فورا بعد از متد قبلی درج می شود. بسته به مقدار برگشتی متد قبلی می توانید اعضا یا متدهای خود را فراخوانی کنید. از آنجاییکه متدهای LINQ یک نتیجه از IEnumerable<T> را برگشت می دهند، شما می توانید از این متدها به صورت تو در تو و یا یکی پس از دیگری استفاده کنید. نتیجه نهایی هم بسته به نوع برگشتی آخرین متد (در مثال بالا Select) در یک متغیر ذخیره می شود. شیوه نوشتن کوئری مانند مثال دوم را ” سبک نقطه ای ” می نامند.

var query2 = from    p in people
             orderby p.LastName, p.FirstName
             where   p.Age >= 18 && p.LastName.StartsWith("A")
             select new { FullName = p.FirstName + " " + p.LastName };
var query2 = people.OrderBy(p => p.LastName).ThenBy(p => p.FirstName)
                   .Where  (p => p.Age >= 18 && p.LastName.StartsWith("A"))
                   .Select (p => new { FullName = p.FirstName + " " + p.LastName });

دستور بالا با استفاده از متد OrderBy افراد را بر اساس نام خانوادگی (LastName) و سپس نام (FirstName) مرتب می کند و سپس با استفاده از Where مشخص می کنیم که از این افراد آنهایی را می خواهیم که سنشان بزرگتر یا مساوی 18 بوده و نام خانوادگی آنها با حرف A شروع می شود. و در نهایت با استفاده از Select نام کامل افراد را چاپ می کنیم. دستور بالا یک نوع بی نام، شامل نام کامل اشخاصی است که در دستور Where مشخص کرده ایم. می توانیم از عبارت let برای تعریف یک متغیر دیگر در داخل کوئری استفاده کنیم و آنرا با یک عبارت یا خصوصیات یک متغیر دیگر مقدار دهی کنیم. در زیر نحوه ی استفاده از عبارت let را مشاهده می کنید :

var query2 = from   p in people
             let    lastName = p.LastName
             where  lastName.StartsWith("A")
             select lastName;
var query2 = people.Select(p   => new { p, lastName = p.LastName })
                   .Where (pln => pln.lastName.StartsWith("A"))
                   .Select(pln => pln.lastName)

در مثال بالا یک متغیر جدید(lastName) تعریف کرده ایم و آن را با خصوصیت LastName متغیر اصلی پرس و جو(p) مقدار دهی کرده ایم.از این متغیر می توانیم در ادامه پرس و جو استفاده نماییم. در سبک نقطه ای ( حالت متدی ) نیز کار مشابه ای را انجام داده ایم.عبارت let بسیار شبیه به متد Select عمل می کند.ما از عبارت Select در ابتدا استفاده می کنیم تا بقیه پرس و جو از تغییرات و خروجی این متد در ادامه استفاده نمایند. می توانیم از چندین منبع داده استفاده کنیم و مقادیر آنها را یکدیگر مقایسه کنیم.در زیر پرس و جویی را می بینید که در آن از دو متغیر استفاده شده است و مقادیر را از دو آرایه عددی استخراج می کنند:

var query3 = from   x in n1
             from   y in n2
             where  x == y
             select x;
var query3 = n1.Intersect(n2);

پرس و جو ابتدا یک مقدار از آرایه n1 استخراج می کند. در ادامه این مقدار با تمامی مقادیر آرایه n2 مقایسه می شود. این مقدار تنها در صورتی در خروجی قرار می گیرد که با یکی از مقادیر آرایه دوم برابر باشد. نسخه متدی بسیار ساده تر است ، زیرا از قبل متدی به نام Intersect وجود دارد که همین کار را انجام می دهد، یعنی مقادیر مشابه دو منبع داده را استخراج می کند. در مثال بعدی از شی ای استفاده کرده ایم که دارای خصوصیتی است که در این خصوصیت مجموعه ای از اشیا قرار دارند. فرض کنیم کلاسی به نام Person داریم که دارای یک خصوصیت به نام Siblings است که این خصوصیت از نوع مجموعه ای (List<Person>) است. با استفاده از Linq به راحتی می توانیم لیست تمامی خواهر یا برادر های یک شخص را استخراج کنیم و حتی می توانیم شرطی را نیز برای انتخاب قرار دهیم :

var query4 = from  p in people
             from  s in p.Siblings
             where s.Age < p.Age
             select new
             {
                 FullName    = p.FirstName + " " + p.LastName,
                 SiblingName = s.FirstName + " " + s.LastName
             };
var query4 = people.SelectMany(p => p.Siblings.Select(s => s).Where(s => s.Age < p.Age));

اولین دستور from یک شخص (Person) را از لیست اشخاص (people) بر می گرداند. دومین دستور from اشیا Person موجود در خصوصیت Siblings شی جاری را یک به یک برگشت می دهد. عبارت where و select به ازای هر شی Person موجود در خصوصیت Siblings اجرا می شوند.بعد از اینکه تمامی این اشیا بررسی شد ، شی Person دیگری از منبع داده اول (people) برگشت داده می شود و روند بالا برای آن شی نیز تکرار می شود. در سبک متدی از SelectMany برای انجام عمل مشابه استفاده کرده ایم. پارامتر این متد یک عبارت لامبدا می باشد. پارامتر این عبارت از نوع اشیا موجود در منبع داده است (Person). در بدنه این عبارت ابتدا تمامی اشیا Siblings شی جاری را برگشت داده ایم و با استفاده از دستور where شرطی را بر روی این اشیا بررسی کرده ایم.