مفهوم LINQ چیست ؟

به نام خداسلام به همه ی عزیزان ، امروز تصمیم دارم مختصری راجع به LINQ در #C صحبت کنم ، امیدوارم که مفید واقع بشه.تلفظ صحیح LINQ لینک است ، لطفاً آنرا < لینکیو > نخوانید. LINQ مخفف Language-Integrated Query است . یک زبان یکپارچه برای بازیابی داده ها از منابع مختلف طراحی شده است. حسن آن این است که عدم تطابق بین زبان های برنامه نویسی و پایگاه های داده را حذف می کند، و همچنین یک رابط پرس و جوی واحد برای انواع مختلف منابع داده را ارائه می دهد.خب همانطوری که SQL یک زبان پرس و جو ساخت یافته است و برای ذخیره و بازیابی داده ها از پایگاه داده استفاده می شود. به همین ترتیب ، LINQ نیز یک دستور ساختار یافته است که در #C و ... برای بازیابی داده ها از انواع مختلف منابع داده مانند مجموعه ها ، ADO.Net DataSet، XML Docs، وب سرویس ، MS SQL Server و سایر پایگاه های داده ساخته شده است.پس در واقع ما از LINQ استفاده می کنیم تا بتوانیم خیلی ساده تر و راحت تر با هر نوع منبع داده یکسان حرف بزنیم و با یک استاندارد داده ها را واکشی کنیم حال منبع داده ما می تواند یک آرایه و یا لیستی از اسامی باشد یا لیستی از اشیاء و یا جدولی در دیتابیس باشد .کوئری های LINQ ، نتایج را به صورت اشیا برمی گرداند و این به شما امکان می دهد از رویکرد شی گرا در مجموعه نتایج استفاده کنید و نگران تبدیل فرمت های مختلف نتایج به اشیا نباشید.مثال زیر یک کوئری ساده LINQ را نشان می دهد که تمام رشته ها را از آرایه ای که حاوی کاراکتر "a" است دریافت می کند:LINQ Query to Array// Data sourcestring[] names = {"Bill", "Steve", "James", "Mohan" };// LINQ Queryvar myLinqQuery = from name in names where name.Contains('a') select name ;// Query executionforeach(var name in myLinqQuery) Console.Write(name + " ");در مثال بالا names ، نام آرایه ی رشته ای یک منبع داده است. در زیر یک کوئری LINQ است که به یک متغیر myLinqQueryاختصاص داده شده است .from name in names where name.Contains('a') select name ;تا زمانی که پرس و جوی LINQ را اجرا نکنید، به نتیجه نخواهید رسید. پرس و جو ی LINQ را می توان به روش های مختلف اجرا کرد، در اینجا ما ازحلقه foreach برای اجرای پرس و جو ذخیره شده در مجموعه myLinqQuery استفاده کردیم ، بنابراین، هر پرس و جوی LINQ باید به نوعی از منابع داده پرس و جو اشاره کند، خواه آرایه، مجموعه، XML یا پایگاه های داده دیگر باشد. پس از نوشتن کوئری LINQ باید آن را اجرا (یا به اصطلاح Execute) کرد تا نتیجه به دست آید.در ادامه می آموزید که چرا باید از LINQ استفاده کنیم.چرا LINQ ؟برای درک اینکه چرا باید از LINQ استفاده کنیم، به چند نمونه نگاه می کنیم. فرض کنید می خواهید لیستی از دانش آموزان را از آرایه ای از اشیاء Student پیدا کنید.قبل از C# 2.0، ما مجبور بودیم از یک حلقه "foreach" یا"for" برای پیمایش مجموعه برای یافتن یک شی خاص استفاده کنیم. به عنوان مثال، ما مجبور شدیم کد زیر را بنویسیم تا همه اشیاء Student را از آرایه ای از Students که سن آنها بین 12 تا 20 سال است (برای نوجوانان 13 تا 19) پیدا کنیم:مثال: از حلقه for برای یافتن عناصر مجموعه در C# 1.0 استفاده می شدclass Student{ public int StudentID { get; set; } public String StudentName { get; set; } public int Age { get; set; } }class Program{ static void Main(string[] args) { Student[] studentArray = { new Student() { StudentID = 1, StudentName = &quotAli&quot, Age = 18 }, new Student() { StudentID = 2, StudentName = &quotAhmad&quot, Age = 21 }, new Student() { StudentID = 3, StudentName = &quotReza&quot, Age = 25 }, new Student() { StudentID = 4, StudentName = &quotSara&quot , Age = 20 }, new Student() { StudentID = 5, StudentName = &quotAtusa&quot , Age = 31 }, new Student() { StudentID = 6, StudentName = &quotparmiss&quot, Age = 17 }, new Student() { StudentID = 7, StudentName = &quotAmir&quot,Age = 19 }, }; Student[] students = new Student[10]; int i = 0; foreach (Student std in studentArray) { if (std.Age > 12 && std.Age < 20) { students[i] = std; i++; } } }}استفاده از حلقه for دست و پا گیر است، قابل نگهداری و خواندن نیست. C# 2.0 یک تایپ delegate را معرفی کرد که می تواند برای مدیریت این نوع سناریوها، استفاده شود.مثال: حال این بار از Delegates برای یافتن عناصر مجموعه در C# 2.0 استفاده کردیم:delegate bool FindStudent(Student std);class StudentExtension{ public static Student[] where(Student[] stdArray, FindStudent del) { int i=0; Student[] result = new Student[10]; foreach (Student std in stdArray) if (del(std)) { result[i] = std; i++; } return result; }}class Program{ static void Main(string[] args) { Student[] studentArray = { new Student() { StudentID = 1, StudentName = &quotAli&quot, Age = 18 }, new Student() { StudentID = 2, StudentName = &quotAhmad&quot, Age = 21 }, new Student() { StudentID = 3, StudentName = &quotReza&quot, Age = 25 }, new Student() { StudentID = 4, StudentName = &quotSara&quot , Age = 20 }, new Student() { StudentID = 5, StudentName = &quotAtusa&quot , Age = 31 }, new Student() { StudentID = 6, StudentName = &quotparmiss&quot, Age = 17 }, new Student() { StudentID = 7, StudentName = &quotAmir&quot,Age = 19 }, }; Student[] students = new Student[10]; int i = 0; foreach (Student std in studentArray) { if (std.Age > 12 && std.Age < 20) { students[i] = std; i++; } } }} Student[] students = StudentExtension.where(studentArray, delegate(Student std) {return std.Age > 12 && std.Age < 20; });}}}بنابراین، در نسخه C# 2.0به بعد از مزیت delegate در یافتن دانش آموزان با هر معیاری برخوردارید. برای یافتن دانش‌آموزان با معیارهای مختلف، لازم نیست از حلقهfor استفاده کنید. برای مثال، می‌توانید از همان تابعdelegate برای پیدا کردن دانش‌آموزی که StudentId او 5 است یا نامش Atusa است، استفاده کنید، مانند زیر:Student[] students = StudentExtension.where(studentArray, delegate(Student std) { return std.StudentID == 5; });//Also, use another criteria using same delegateStudent[] students = StudentExtension.where(studentArray, delegate(Student std) { return std.StudentName == &quotAtusa&quot });تیم سی شارپ احساس کردند که هنوز باید کد را فشرده‌تر و خواناتر کنند. بنابراین آنها extension method، lambda expression، expression tree ، anonymous type ،query expression را در سی شارپ 3.0 معرفی کردند .(این مفاهیم بصورت جداگانه در پستهای دیگر آموزش داده می شود) شما می‌توانید از این ویژگی‌های C# 3.0 استفاده کنید، که بلوک‌های سازنده LINQ برای پرس و جو در انواع مختلف مجموعه و دریافت عنصر(های) به‌دست‌ آمده در یک عبارت واحد هستند.مثال زیر نشان می دهد که چگونه می توانید از پرس و جوی LINQ با عبارت lambda برای یافتن دانش آموز خاصی از مجموعه دانش آموز استفاده کنید:Student[] studentArray = {new Student() { StudentID = 1, StudentName = &quotJohn&quot, age = 18 } ,new Student() { StudentID = 2, StudentName = &quotSteve&quot, age = 21 } ,new Student() { StudentID = 3, StudentName = &quotBill&quot, age = 25 } ,new Student() { StudentID = 4, StudentName = &quotRam&quot , age = 20 } ,new Student() { StudentID = 5, StudentName = &quotRon&quot , age = 31 } ,new Student() { StudentID = 6, StudentName = &quotChris&quot, age = 17 } ,new Student() { StudentID = 7, StudentName = &quotRob&quot,age = 19 } ,};// Use LINQ to find teenager studentsStudent[] teenAgerStudents = studentArray .Where(s => s.age > 12 && s.age < 20) .ToArray() ;// Use LINQ to find first student whose name is BillStudent bill = studentArray .Where(s => s.StudentName == &quotBill&quot) .FirstOrDefault() ;// Use LINQ to find student whose StudentID is 5Student student5 = studentArray .Where(s => s.StudentID == 5) .FirstOrDefault() ;}}مزایای استفاده از LINQ:زبان آشنا : توسعه دهندگان مجبور نیستند برای هر نوع منبع داده یا قالب داده، یک زبان جستجوی جدید یاد بگیرند.کدنویسی کمتر : در مقایسه با رویکرد سنتی تر، مقدار کدی را که باید نوشته شود کاهش می دهد.کد قابل خواندن : LINQ کد را خواناتر می کند تا توسعه دهندگان دیگر بتوانند به راحتی آن را درک کرده و حفظ کنند.روش استاندارد پرس و جو از چندین منبع داده : از همان ساختار LINQ می توان برای پرس و جو از چندین منبع داده استفاده کرد.ایمنی زمان کامپایل کوئری ها : بررسی نوع اشیاء را در زمان کامپایل فراهم می کند.پشتیبانی از IntelliSense : LINQ IntelliSense را برای مجموعه‌های عمومی فراهم می‌کند.شکل دادن به داده ها: می توانید داده ها را به اشکال مختلف بازیابی کنید.خب امیدوارم از این پست و آموزش LINQ لذت برده باشید ، مرسی که وقت گذاشتید و مطالعه کردید .راههای ارتباط با من :حتماً به کانال تلگرام من سر بزنید ، آموزشهای متنوعی در آنجا هست .موفق و پیروز باشید.علی عظیم زاده