LINQ so’rovlaridagi asosiy amallar

1.3 LINQ so’rovlaridagi asosiy amallar
Ma’lumotlar manbasini tanlab olish(Obtaining a Data Source)
LINQ so'rovida birinchi qadam ma'lumotlar manbasini ko'rsatishdir. Ko'pgina dasturlash tillarida bo'lgani kabi C# da o'zgaruvchidan foydalanishdan oldin uni e'lon qilish kerak. LINQ so'rovida ma'lumotlar manbasini (Customer) va diapazon o'zgaruvchisini (cust) kiritish uchun birinchi bo'lib from keladi.
//queryAllCustomers is an IEnumerable
var queryAllCustomers = from cust in customers
select cust;
Diapazon oʻzgaruvchisi foreach siklidagi iteratsiya oʻzgaruvchisiga oʻxshaydi, bundan tashqari soʻrov ifodasida haqiqiy iteratsiya sodir boʻlmaydi. So'rov bajarilganda, diapazon o'zgaruvchisi Customer dagi har bir keyingi elementga havola bo'lib xizmat qiladi. Kompilyator cust tipi haqida xulosa chiqarishi mumkinligi sababli, uni aniq ko'rsatish shart emas. Qo'shimcha diapazon o'zgaruvchilari let bandi bilan kiritilishi mumkin.
Filtrlash(Filtering)
Ehtimol, eng keng tarqalgan so'rov operatsiyasi mantiqiy ifoda ko'rinishidagi filtrni qo'llashdan iborat bo’lishi mumkin. Filtr - so’rov faqat ifoda rost bo'lgandagina elementlarni qaytarishini ta’minlab beradi. Natija where foydalanib ishlab chiqariladi.Filtr manba ketma-ketligidan qaysi elementlarni chiqarib tashlashni ham belgilaydi. Quyidagi misolda yashash manzili faqat London bo'lgan mijozlar qaytariladi:
var queryLondonCustomers = from cust in customers
where cust.City == "London"
select cust;
Where kerak bo'lganda ko'proq filtr ifodalarini qo'llash uchun t C# mantiqiy operatorlari AND va OR dan foydalanishingiz mumkin. Masalan,manzili faqat "London" va "Devon" bo'lgan mijozlarni qaytarish uchun quyidagi kod yoziladi:
where cust.City == "London" && cust.Name == "Devon"
London yoki Parijdan qaytadigan mijozlar uchun esa quyidagi kod yoziladi:
where cust.City == "London" || cust.City == "Paris"
3.Tartiblashtirish(Ordering)
Ko'pincha qaytarilgan ma'lumotlarni saralash anchagina qulayliklarni tug’diradi. OrderBy bandi qaytarilgan ketma-ketlikdagi elementlarni tartiblangan tip uchun standart solishtiruvchiga muvofiq tartiblashiga olib keladi. Misol uchun, natijalarni Name xususiyatiga qarab tartiblash uchun quyidagi so'rovni kengaytirish mumkin. Name string tipida bo'lgani uchun standart taqqoslash A dan Z gacha alifbo bo’yicha tartiblashni amalga oshiradi.
var queryLondonCustomers3 =
from cust in customers
where cust.City == "London"
orderby cust.Name ascending
select cust;
Mabodo teskari holatda tartiblashga ehtiyoj paydo bo’lsa bu amal OrderBy....decending orqali amalga oshiriladi.
4.Guruhlash(Grouping)
Group bandi natijalarni belgilangan kalit asosida guruhlash imkonini beradi. Masalan, London yoki Parijdagi barcha mijozlar alohida guruhlarda bo’lishi uchun natijalar City bo’yicha guruhlanishi kerakligini belgilashingiz mumkin. Bu holatda cust.City asosiy kalit bo’lib hisoblanadi.
// queryCustomersByCity is an IEnumerable
var queryCustomersByCity =
from cust in customers
group cust by cust.City;
// customerGroup is an IGrouping
foreach (var customerGroup in queryCustomersByCity)
{
Console.WriteLine(customerGroup.Key);
foreach (Customer customer in customerGroup)
{
Console.WriteLine(" {0}", customer.Name);
}
}
So'rov Group bilan tugatilsa, natijalar ro'yxatlar ketma-ketligi shaklida bo'ladi. Roʻyxatdagi har bir element Key aʼzosi(key member) va shu kalit ostida guruhlangan elementlar roʻyxatiga ega boʻlgan ob’ekt bo’lib hisoblanadi. Guruhlar ketma-ketligini hosil qiluvchi so'rovni takrorlashda, ichki foreach siklidan foydalanish kerak. Agar siz guruh operatsiyasi natijalariga murojaat qilishingiz kerak bo'lsa, into kalit so'zidan foydalanishingiz mumkin. Quyidagi so'rov faqat ikkitadan ortiq mijozni o'z ichiga olgan guruhlarni qaytaradi:
// custQuery is an IEnumerable
var custQuery =
from cust in customers
group cust by cust.City into custGroup
where custGroup.Count() > 2
orderby custGroup.Key
select custGroup;
5.Ulanish(Joining)
Ulanish operatsiyalari ma'lumotlar manbalarida aniq modellashtirilmagan ketma-ketliklar o'rtasida bog’lanishlarni yaratadi. Misol uchun, siz bir xil manzilda yashovchi barcha mijozlar va hissadorlarni topish uchun ulanishni amalga oshirish mumkin. LINQ da join bandi har doim to'g'ridan-to'g'ri ma'lumotlar bazasi jadvallari o'rniga ob’ektlar to’plamiga qarshi ishlaydi.
var innerJoinQuery =
from cust in customers
join dist in distributors on cust.City equals dist.City
select new { CustomerName = cust.Name, DistributorName = dist.Name };
LINQ-da, SQL-da bo'lgani kabi, join ni tez-tez ishlatishingiz shart emas, chunki LINQ-dagi foreign keys ob’ekt modelida elementlar to'plamini saqlaydigan xususiyatlar sifatida taqdim etiladi. Masalan, Customer ob’ekti order ob’ektlari to'plamini o'z ichiga oladi:
from order in Customer.Orders...
6.Tanlash(Selecting)
Select so'rov natijalarini ishlab chiqaradi va har bir qaytarilgan elementning tipini belgilaydi. Misol uchun, natijalaringiz to'liq Customer ob’ektlaridan, faqat bitta a'zodan, a'zolar kichik to'plamidan yoki hisoblash yoki yangi ob'ekt yaratishga asoslangan ba'zi butunlay boshqa tiplardan iborat bo'lishini belgilash ham mumkin.Select manba elementining nusxasidan boshqa narsani qaytarsa, bu amal proyeksiya(projection) deb ataladi. Ma'lumotlarni o'zgartirish uchun proyeksiyalardan foydalanish LINQ so'rov ifodalarining asosiy muhim jihatidir.
|