آموزش Linq (بخش دوم)
بسم الله الرحمن الرحیم
مشاهده تمامی آموزش های دوره LINQ
آموزش LINQ
بخش دوم
LINQ
در این بخش عملگرهای استاندارد و اصلی لینک به همراه توابع تجمعی را آموزش خواهم داد.
منباب اطلاع: شما با استفاده از لینک می توانید بر روی نوع های جنریک های مختلف کوئری بزنید مثال:
IEnumerable<Customer> customerQuery = from cust in customers where cust.City == "London" select cust;
foreach (Customer customer in customerQuery)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}
بحثی در لینک وجود دارد به نام اجرای با تعویق، در واقع به این معنی است که هنگامی که شما یک دستور لنیک را می نویسید آن را فقط ایجاد می کنید و وقتی آن را با foreach می خوانید در آن زمان اجرا می کنید. متغییر پرس وجو هرگز نتایج را نگهداری نمی کند یعنی اگر شما یک دستور را بر روی پایگاه داده اجرا کنید و پایگاه داده دائما تغییر کند نتایج شما هم به ازای هر بار اجرا شدن (منظور از اجرا شدن مثلا همان دستور foreach است) نتایج متفاوتی خواهد داشت.
بعضی دستورات لینک صریحا اجرا می شوند مثل First و Average ،Max ،Count چون باید اجرا شوند تا بتوانند نتیجه را مشخص کنند و این نوع دستورات یک مقدار بر می گرداند به این عملگر ها، عملگرهای تجمعی می گویند.
بسم الله الرحمن الرحیم
مشاهده تمامی آموزش های دوره LINQ
آموزش LINQ
بخش دوم
LINQ
در این بخش عملگرهای استاندارد و اصلی لینک به همراه توابع تجمعی را آموزش خواهم داد.
منباب اطلاع: شما با استفاده از لینک می توانید بر روی نوع های جنریک های مختلف کوئری بزنید مثال:
IEnumerable<Customer> customerQuery = from cust in customers where cust.City == "London" select cust;
foreach (Customer customer in customerQuery)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}
بحثی در لینک وجود دارد به نام اجرای با تعویق، در واقع به این معنی است که هنگامی که شما یک دستور لنیک را می نویسید آن را فقط ایجاد می کنید و وقتی آن را با foreach می خوانید در آن زمان اجرا می کنید. متغییر پرس وجو هرگز نتایج را نگهداری نمی کند یعنی اگر شما یک دستور را بر روی پایگاه داده اجرا کنید و پایگاه داده دائما تغییر کند نتایج شما هم به ازای هر بار اجرا شدن (منظور از اجرا شدن مثلا همان دستور foreach است) نتایج متفاوتی خواهد داشت.
بعضی دستورات لینک صریحا اجرا می شوند مثل First و Average ،Max ،Count چون باید اجرا شوند تا بتوانند نتیجه را مشخص کنند و این نوع دستورات یک مقدار بر می گرداند به این عملگر ها، عملگرهای تجمعی می گویند.
Aggregate operation - عملگر های تجمعی
Count
var evenNumQuery = from num in numbers where (num % 0 == 2) select num;
int evenNumCount = evenNumQuery.Count();
یا
int query = customers.Count();
LongCount
long query = customers.LongCount();
Sum
int[] integers = { 5, 3, 8, 9, 1, 7 };
int sum = integers.Sum();
Max , Min
int max = integers.Max();
int min = integers.Min();
average
double average = integers.Average();
همچنین می توانید با اجرای دستور ToList یا ToArray دستورات لینک را فورا اجرا کنید
ToList()
List<int> numQuery2 = (from num in numbers where (num % 0 == 2) select num).ToList();
ToArray()
var numQuery3 = (from num in numbers where (num % 2 ==0 ) select num).ToArray();
برای نگهداری خروجی این کوئری هم می توانید از متغییری با نوع var و هم با ساختن یک لیست از نوع منبع این کار را انجام دهید.
متغییرهای نوع var هنگامی که مقدار دهی می شوند نوعشان مشخص می شود.
عملگر های استاندارد پرس و جو
WHERE
همانطور که می دانید در قسمت where می توانید شرط با && , || ترکیب کنید، فکر نکنم نیازی به مثال باشد.
OrderBy
عبارت پرس وجوی |
توضیح |
اسم متد |
orderby |
مقادیر را به ترتیب صعودی مرتب می کند |
orderby |
OrderBy …. Descending |
مقادیر را به ترتیب نزولی مرتب می کند |
OrderByDescending |
Orderby …,…. |
یک مرتب سازی ثانویه را به ترتیب صعودی انجام می دهد |
ThenBy |
OrderBy …., Descending…. |
یک مرتب سازی ثانویه را به ترتیب نزولی انجام می دهد. |
ThenByDescending |
اعمال نمی شود |
ترتیب عناصر واقع در یک مجموعه را برعکس. می کند. |
Reverse |
string[] words = { "the", "quick", "brown", "fox", "jumps" };
IEnumerable<string> query = from word in words orderby word.Length select word;
یا
IEnumerable<string> query = from word in words orderby word.Substring(0, 1) descending select word;
یا
IEnumerable<string> query = from word in words orderby word.Length, word.Substring(0, 1) select word;
یا
IEnumerable<string> query = from word in words orderby word.Length, word.Substring(0, 1) descending select word;
Select
یک روش استفاده از متد select همان روش معمولی است که عناصر را انتخاب می کنیم و روش دوم ساختن شی جدید با عناصر انتخاب شده است مثال:
روش اول
List<string> phrases = new List<string>() { "an apple a day", "the quick brown fox" };
var query = from phrase in phrases from word in phrase.Split(' ') select word;
foreach (string s in query)
Console.WriteLine(s);
/* This code produces the following output:
an
apple
a
day
the
quick
brown
fox
*/
روش دوم
List<Customer> customers = new List<Customer>()
{
new Customer() {Name ="Esmaeil" , Family = "Sheidaei" , CustomerID =0 },
new Customer() {Name ="E$H" , Family = "Sheidaei" , CustomerID =2 },
var query = customers.Select((p,index) => new{position=index,p.Name, p.Family }
});
Projection
در بعضی موارد شما در انتخاب خروجی کوئری نیاز دارید که نوع خروجی را مشخص کنید، به این فرایند Projection گویند مثال:
var queryCustomersByCity = from cust in customers select cust.name;
SelectMany
var query =customers.Where(c => c.Family == "sheidaei")
.SelectMany(c => c.Orders.Where(o => o.OrderDate.Year > 2010)
.Select(o => new { c.Family , o.OrderID })
اگر بخواهیم کد را به صورت دیگر بنویسیم (به روش Experssion) نتیجه به این صورت می شود
var query = from c in customers where c.Family == "sheidaei" from o in c.Orders where o.OrderDate.Year > 2010
select new { c.Name, o.OrderID };