So'rov ifodasi (query expression) ning umumiy tavsifi

|
So'rov ifodasi (query expression) ning umumiy tavsifi
|
bet | 3/11 | Sana | 02.02.2024 | Hajmi | 145,5 Kb. | | #150530 |
Bog'liq Linq texnologiyasi tavsifi-fayllar.orgSo'rov ifodasi (query expression) ning umumiy tavsifi
So'rov ifodalari(query expression) LINQ yoqilgan har qanday ma'lumot manbasidan ma'lumotlarni so'rash va o'zgartirish uchun ishlatilishi mumkin. Masalan, bitta so'rov SQL ma'lumotlar bazasidan ma'lumotlarni olishi va natijani chiqarish sifatida XML oqimini ishlab chiqishi mumkin.
So'rov ifodalari (query expression)ni tushunish oson, chunki ularda ko'plab tanish C# tili konstruksiyalaridan foydalaniladi.
Garchi ko'p hollarda tipni aniq ko'rsatish shart bo’lmasada, so'rov ifodasi (query expression)dagi o'zgaruvchilarning barchasi qat’iy yozilishi kerak, chunki kompilyator uni qabul qilishi mumkin.
So'rov o'zgaruvchisi, masalan, foreach sintaksisida uni takrorlamaguningizcha so'rov bajarilmaydi.
Kompilyatsiya vaqtida so'rov ifodalari (query expression) C# dagi o’ziga xos jihatlarga ko’ra belgilangan qoidalarga muvofiq standart so'rov operatori usulini chaqiruvlari (Standard Query Operator method calls)ga aylantiriladi. So'rovlar sintaksisi yordamida ifodalanishi mumkin bo'lgan har qanday so'rovni metod sintaksisi yordamida ham ifodalash mumkin. Biroq, ko'p hollarda so'rovlar sintaksisi yanada o'qilishga qulayroq va qisqa bo’ladi
Qoida tariqasida, LINQ so'rovlarini yozishda iloji boricha so'rovlar sintaksisi va kerak bo'lganda metodlar sintaksisidan foydalanishni tavsiya qilinadi.Bu ikkala uslub orasida ko’rinish yoki manoviy jihatdan hech qanday farq kuzatilmaydi.Biroq metodlar sintaksisida yozilgan variantlarga nisbatan so'rov ifodalari ko'proq uchraydi.
Count yoki Max kabi ba'zi so'rov operatsiyalarida ekvivalent so'rov ifodasi bandi yo'q va shuning uchun ular metod chaqiruvi usulida ifodalanishi kerak.Metod sintaksisi so'rovlar sintaksisi bilan turli usullarda birlashtirilishi ham mumkin.
So’rov – ma’lumotlar manbasidan ma’lumotlarni oladigan tuzilmadir. So’rovlar odatda maxsus so’rovlar tilida ifodalanadi. Vaqt o'tishi bilan har xil turdagi ma'lumotlar manbalari uchun turli tillar ishlab chiqilgan, masalan, relyatsion ma'lumotlar bazalari uchun SQL va XML uchun XQuery. Shu sababli, ishlab chiquvchilar qo'llab-quvvatlashi kerak bo'lgan har bir ma'lumot manbasi yoki ma'lumotlar formati uchun yangi so'rovlar tilini o'rganishlari kerak edi. LINQ turli xil ma'lumotlar manbalari va formatlarida ma'lumotlar bilan ishlash uchun izchil modelni taklif qilish orqali ushbu vaziyatni soddalashtiradi. LINQ so'rovida siz doimo ob'ektlar bilan ishlaysiz. Siz XML hujjatlari, SQL maʼlumotlar bazalari, ADO.NET maʼlumotlar toʻplami, .NET toʻplamlari va LINQ provayderi mavjud boʻlgan boshqa formatlardagi maʼlumotlarni soʻrash va oʻzgartirish uchun bir xil asosiy kodlashdan foydalanasiz.
Barcha LINQ so'rov operatsiyalari uchta alohida amallar ketma-ketligidan iborat:
1)ma'lumotlar bazasini aniqlash
2)so'rovni yaratish
3)so'rovni amalga oshirish
Quyidagi misolda so'rov operatsiyasining uchta qismi manba kodida qanday ifodalanganligi ko'rsatilgan. Misolda qulay bo’lishi uchun ma’lumotlar manbai sifatida butun sonli massivdan foydalanadi,ammo xuddi shu tushunchalar boshqa ma’lumotlar manbalariga ham tegishli bo’ladi.
class IntroToLINQ
{ static void Main()
{
// The Three Parts of a LINQ Query:
// 1. Data source.
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
// 2. Query creation.
// numQuery is an IEnumerable
var numQuery =
from num in numbers
where (num % 2) == 0
select num;
// 3. Query execution.
foreach (int num in numQuery)
{Console.Write("{0,1} ", num) }}}
Quyidagi rasmda so'rovning to'liq ishlashi ko'rsatilgan. LINQ da so'rovning bajarilishi so'rovning o'zidan farq qiladi. Boshqacha qilib aytganda, so'rov o'zgaruvchisini yaratish orqali hech qanday ma'lumot olinmaydi:
Oldingi misolda ma'lumotlar manbai massiv bo'lgani uchun u umumiy IEnumerable interfeysini bilvosita qo'llab-quvvatlaydi. Bu esa LINQ dan foydalanish imkonini yaratadi. So'rov foreach operatorida bajariladi va foreach IEnumerable yoki IEnumerable ni talab qiladi. IEnumerable yoki umumiy IQueryable ni qo'llab-quvvatlaydigan turlar so'rov turlari deb ataladi.
LINQ ma'lumotlar manbai sifatida xizmat qilishi uchun so'rov turi hech qanday o'zgartirish yoki maxsus ishlov berishni talab qilmaydi. Agar manba ma'lumotlari so'rov turi sifatida xotirada bo'lmasa, LINQ provayderi uni shu holatda ko'rsatishi kerak bo’ladi. Misol uchun, LINQ to XML - XML hujjatni Xelement so’rov turiga yuklaydi:
// Create a data source from an XML document.
// using System.Xml.Linq;
XElement contacts = XElement.Load(@"c:\myContactList.xml");
LINQ to SQL bilan odatda dizayn ustida ishlash vaqtida qo’lda yoki Visual Studio da LINQ to SQL asboblaridan foydalangan holda ob’ektga aloqador tip almashtirishni bajarish mumkin(mapping).So’rovlar ob’ektlarga yo’naltiriladi va dastur ishlashi vaqtida LINQ to SQL ma'lumotlar bazasi bilan aloqani boshqaradi. Quyidagi misolda Customers ma'lumotlar bazasidagi ma'lum bir jadvalni ifodalaydi va so'rov natijasining turi IQueryable IEnumerable dan kelib chiqadi:
Northwnd db = new Northwnd(@"c:\northwnd.mdf");
// Query for customers in London.
IQueryable custQuery =
from cust in db.Customers
where cust.City == "London"
select cust;
Muayyan turdagi ma'lumotlar manbalarini qanday yaratish haqida ko'proq ma'lumot olish uchun turli LINQ provayderlarga bog’liq bo’lgan hujjatlarga murojaat qilish maqsadga muvofiq bo’ladi. Biroq, asosiy qoida juda oddiy: LINQ ma'lumotlar manbai - bu umumiy IEnumerable interfeysini qo'llab-quvvatlaydigan har qanday ob’ekt yoki undan meros qilib olingan interfeysdir.
So'rov ma'lumotlar manbasidan yoki manbalardan qanday ma'lumotlarni olish kerakligini belgilaydi. Majburiy bo’lmasada so'rov shuningdek, bu ma'lumotni qaytarishdan oldin qanday saralanishi, guruhlanishi va shakllantirilishi kerakligini belgilaydi. So'rov so'rov o'zgaruvchisida saqlanadi va so'rov ifodasi bilan ishga tushiriladi. So'rovlarni yozishni osonlashtirish uchun C# da yangi so'rovlar sintaksislari kiritilgan.Oldingi misoldagi so'rov butun sonlar massividagi barcha juft raqamlarni qaytaradi. So'rov ifodasi uchta banddan iborat:from,where,select.
From kalit so’zi ma'lumotlar manbasini, where filtrlar qo'llanilishini va select esa qaytarilgan elementlar tipini belgilaydi.Hozircha muhim jihat shundaki, LINQ da so'rov o'zgaruvchisi hech qanday funksiyani bajarmaydi va hech qanday ma'lumot qaytarmaydi.So'rov keyinchalik bajarilganda natijalarni olish uchun undan zarur bo'lgan ma'lumotlarni saqlash uchun foydalaniladi.Yuqorida aytib o'tilganidek, so'rov o'zgaruvchisining o'zi so'rov buyruqlarini saqlaydi. So'rovning haqiqiy bajarilishi foreach qismidagi so'rov o'zgaruvchisi ustida takrorlash bajarilmagunicha kechiktiriladi. Ushbu kontseptsiya deferred execution deb ataladi va quyidagi misollarda buni ko’rishimiz mumkin:
// Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
Foreach da, shuningdek, so'rov natijalari ham olinadi. Misol uchun, oldingi so'rovda num o'zgaruvchisi qaytarilgan ketma-ketlikda har bir qiymatni (bir vaqtning o'zida) ushlab tura oladi.Chunki so'rov o'zgaruvchisining o'zi hech qachon so'rov natijalarini saqlamaydi, siz uni xohlagancha tez-tez bajarishingiz mumkin. Misol uchun, sizda alohida dastur tomonidan doimiy ravishda yangilanib turadigan ma'lumotlar bazasi bo'lishi mumkin. Ilovangizda siz eng so'nggi ma'lumotlarni oladigan bitta so'rov yaratishingiz mumkin va har safar turli natijalarni olish uchun uni ma'lum vaqt oralig'ida qayta-qayta bajarishingiz mumkin. Bir qator manba elementlari bo'yicha yig’ish funksiyalarini bajaradigan so'rovlar avval ushbu elementlarni takrorlashi kerak. Bunday so‘rovlarga Count, Max, Average va First so‘rovlarini misol qilib keltirish mumkin. Ular aniq ravishda foreach siz ishlaydi, chunki so'rovning o'zi natijani qaytarish uchun foreach dan foydalanishi kerak. Shuni ham yodda tutingki, bu turdagi so'rovlar IEnumerable to'plamini emas, balki bitta qiymatni qaytaradi. Quyidagi so‘rov manbasi massivdagi juft sonlar nechtaligini qaytaradi:
var evenNumQuery =
from num in numbers
where (num % 2) == 0
select num;
Har qanday so'rovni darhol bajarishga uchun va uning natijalarini keshlash uchun siz ToList yoki ToArray usullarini chaqirishingiz mumkin.
List numQuery2 =
(from num in numbers
where (num % 2) == 0
select num).ToList();
// or like this:
// numQuery3 is still an int[]
var numQuery3 =
(from num in numbers
where (num % 2) == 0
select num).ToArray();
int evenNumCount = evenNumQuery.Count();
|
| |