به نام خدا
سلام به همه ی عزیزان ، امروز تصمیم دارم مختصری راجع به 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 source
string[] names = {"Bill", "Steve", "James", "Mohan" };
// LINQ Query
var myLinqQuery = from name in names
where name.Contains('a')
select name
;
// Query execution
foreach(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 استفاده کنیم، به چند نمونه نگاه می کنیم. فرض کنید می خواهید لیستی از دانش آموزان را از آرایه ای از اشیاء 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 = "Ali", Age = 18 },
new Student() { StudentID = 2, StudentName = "Ahmad", Age = 21 },
new Student() { StudentID = 3, StudentName = "Reza", Age = 25 },
new Student() { StudentID = 4, StudentName = "Sara" , Age = 20 },
new Student() { StudentID = 5, StudentName = "Atusa" , Age = 31 },
new Student() { StudentID = 6, StudentName = "parmiss", Age = 17 },
new Student() { StudentID = 7, StudentName = "Amir",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 = "Ali", Age = 18 },
new Student() { StudentID = 2, StudentName = "Ahmad", Age = 21 },
new Student() { StudentID = 3, StudentName = "Reza", Age = 25 },
new Student() { StudentID = 4, StudentName = "Sara" , Age = 20 },
new Student() { StudentID = 5, StudentName = "Atusa" , Age = 31 },
new Student() { StudentID = 6, StudentName = "parmiss", Age = 17 },
new Student() { StudentID = 7, StudentName = "Amir",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 delegate
Student[] students = StudentExtension.where(studentArray, delegate(Student std) {
return std.StudentName == "Atusa"
});
تیم سی شارپ احساس کردند که هنوز باید کد را فشردهتر و خواناتر کنند. بنابراین آنها 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 = "John", age = 18 } ,
new Student() { StudentID = 2, StudentName = "Steve", age = 21 } ,
new Student() { StudentID = 3, StudentName = "Bill", age = 25 } ,
new Student() { StudentID = 4, StudentName = "Ram" , age = 20 } ,
new Student() { StudentID = 5, StudentName = "Ron" , age = 31 } ,
new Student() { StudentID = 6, StudentName = "Chris", age = 17 } ,
new Student() { StudentID = 7, StudentName = "Rob",age = 19 } ,
};
// Use LINQ to find teenager students
Student[] teenAgerStudents = studentArray .Where(s => s.age > 12 && s.age < 20) .ToArray() ;
// Use LINQ to find first student whose name is Bill
Student bill = studentArray .Where(s => s.StudentName == "Bill") .FirstOrDefault() ;
// Use LINQ to find student whose StudentID is 5
Student student5 = studentArray .Where(s => s.StudentID == 5) .FirstOrDefault() ;
}
}
خب امیدوارم از این پست و آموزش LINQ لذت برده باشید ، مرسی که وقت گذاشتید و مطالعه کردید .
راههای ارتباط با من :
حتماً به کانال تلگرام من سر بزنید ، آموزشهای متنوعی در آنجا هست .
موفق و پیروز باشید.
علی عظیم زاده