16-bo‘lim
LINQ - ma'lumot ustida so'rov
VB ning o'ziga xos so'rov sintaksisi, From/Where/Select, Order By, Group By, Aggregate, metod shakli va kechiktirilgan bajarilish.
Ushbu bo‘lim mundarijasi
LINQ - to'plamlar ustida so'rov yozish usuli. Visual Basic da u
deyarli SQL ga o'xshaydi va bu tilning eng chiroyli tomonlaridan
biri.
Birinchi so'rov #
Module Dastur
Sub Main()
Dim sonlar() As Integer = {4, 17, 8, 23, 15, 42, 9}
Dim kattalar = From s In sonlar
Where s > 10
Select s
Console.WriteLine(String.Join(", ", kattalar))
End Sub
End Module
17, 23, 15, 42
O'qilishi: "sonlar ichidan har bir s ni ol, agar s 10 dan katta
bo'lsa, s ni tanla".
Saralash #
Module Dastur
Sub Main()
Dim sonlar() As Integer = {4, 17, 8, 23, 15, 42, 9}
Dim osib = From s In sonlar Order By s Select s
Console.WriteLine(String.Join(", ", osib))
Dim kamayib = From s In sonlar Order By s Descending Select s
Console.WriteLine(String.Join(", ", kamayib))
End Sub
End Module
4, 8, 9, 15, 17, 23, 42
42, 23, 17, 15, 9, 8, 4
Obyektlar bilan #
Public Class Talaba
Public Property Ism As String
Public Property Ball As Integer
Public Property Guruh As String
Public Sub New(ism As String, ball As Integer, guruh As String)
Me.Ism = ism
Me.Ball = ball
Me.Guruh = guruh
End Sub
End Class
Module Dastur
Function Royxat() As List(Of Talaba)
Return New List(Of Talaba) From {
New Talaba("Malika", 88, "A"),
New Talaba("Husanboy", 92, "B"),
New Talaba("Nodira", 75, "A"),
New Talaba("Aziza", 95, "B"),
New Talaba("Kamola", 61, "A")
}
End Function
Sub Main()
Dim alochilar = From t In Royxat()
Where t.Ball >= 85
Order By t.Ball Descending
Select t.Ism & " (" & t.Ball & ")"
For Each s As String In alochilar
Console.WriteLine(s)
Next
End Sub
End Module
Aziza (95)
Husanboy (92)
Malika (88)
Yangi shakl yasash #
Public Class Mahsulot
Public Property Nom As String
Public Property Narx As Decimal
Public Property Soni As Integer
Public Sub New(nom As String, narx As Decimal, soni As Integer)
Me.Nom = nom
Me.Narx = narx
Me.Soni = soni
End Sub
End Class
Module Dastur
Sub Main()
Dim omborxona As New List(Of Mahsulot) From {
New Mahsulot("Olma", 12000D, 40),
New Mahsulot("Anor", 18000D, 15),
New Mahsulot("Uzum", 22000D, 8)
}
Dim hisobot = From m In omborxona
Select Nomi = m.Nom, Jami = m.Narx * m.Soni
For Each q In hisobot
Console.WriteLine($"{q.Nomi.PadRight(8)} {q.Jami}")
Next
End Sub
End Module
Olma 480000
Anor 270000
Uzum 176000
Select Nomi = ..., Jami = ... - anonim tur yaratadi. Sinf
e'lon qilmasdan, faqat kerakli maydonlardan iborat vaqtinchalik
obyekt.
Guruhlash #
Public Class Talaba
Public Property Ism As String
Public Property Ball As Integer
Public Property Guruh As String
Public Sub New(ism As String, ball As Integer, guruh As String)
Me.Ism = ism
Me.Ball = ball
Me.Guruh = guruh
End Sub
End Class
Module Dastur
Sub Main()
Dim royxat As New List(Of Talaba) From {
New Talaba("Malika", 88, "A"),
New Talaba("Husanboy", 92, "B"),
New Talaba("Nodira", 75, "A"),
New Talaba("Aziza", 95, "B"),
New Talaba("Kamola", 61, "A")
}
Dim guruhlar = From t In royxat
Group t By Kalit = t.Guruh Into Guruh = Group
Order By Kalit
Select Kalit, Soni = Guruh.Count(),
Ortacha = Math.Round(
Guruh.Average(Function(x) x.Ball), 1)
For Each g In guruhlar
Console.WriteLine(
$"{g.Kalit}-guruh: {g.Soni} talaba, " &
$"o'rtacha {g.Ortacha}")
Next
End Sub
End Module
A-guruh: 3 talaba, o'rtacha 74.7
B-guruh: 2 talaba, o'rtacha 93.5
Group By natijasining tartibi kafolatlanmagan. Yuqorida Order By
Kalit yozilgani shundan.
Umumiy qoida: chiqishda tartib muhim bo'lsa, har doim Order By
qo'shing - Group By, Distinct yoki Dictionary dan keyin
ayniqsa.
Metod shakli #
Har bir so'rovni metod chaqiruvlari bilan ham yozish mumkin:
Module Dastur
Sub Main()
Dim sonlar() As Integer = {4, 17, 8, 23, 15, 42, 9}
Dim soroq = From s In sonlar Where s > 10 Order By s Select s
Dim metod = sonlar.Where(Function(s) s > 10).OrderBy(Function(s) s)
Console.WriteLine(String.Join(", ", soroq))
Console.WriteLine(String.Join(", ", metod))
End Sub
End Module
15, 17, 23, 42
15, 17, 23, 42
Ikkalasi bir xil ishlaydi. Function(s) s > 10 - bu lambda,
ya'ni nomsiz funksiya. Keyingi bo'limda batafsil ko'ramiz.
| Vazifa | So'rov shakli | Metod shakli |
|---|---|---|
| Filtrlash | Where s > 10 | .Where(Function(s) s > 10) |
| Tanlash | Select s.Ism | .Select(Function(s) s.Ism) |
| Saralash | Order By s | .OrderBy(Function(s) s) |
| Guruhlash | Group ... Into | .GroupBy(...) |
Where va Select dan iborat oddiy so'rov uchun metod shakli
qisqaroq.
Group By, Join yoki bir necha Where bo'lgan murakkab so'rov
uchun so'rov shakli ancha o'qilishi oson - u SQL kabi tepadan
pastga o'qiladi.
Ko'p loyihalarda ikkalasi aralash ishlatiladi va bu normal.
Yig'ma amallar #
Module Dastur
Sub Main()
Dim ballar() As Integer = {88, 92, 75, 95, 61}
Console.WriteLine(ballar.Count())
Console.WriteLine(ballar.Sum())
Console.WriteLine(ballar.Max())
Console.WriteLine(ballar.Min())
Console.WriteLine(ballar.Average())
Console.WriteLine(ballar.Count(Function(b) b >= 85))
Console.WriteLine(ballar.Any(Function(b) b > 90))
Console.WriteLine(ballar.All(Function(b) b >= 60))
End Sub
End Module
5
411
95
61
82.2
3
True
True
| Metod | Nima qaytaradi |
|---|---|
Count | Soni (shart bilan ham) |
Sum / Average | Yig'indi / o'rtacha |
Max / Min | Eng katta / kichik |
Any | Hech bo'lmaganda bittasi mos keladimi |
All | Hammasi mos keladimi |
First, FirstOrDefault va Single #
Module Dastur
Sub Main()
Dim sonlar() As Integer = {4, 17, 8, 23}
Console.WriteLine(sonlar.First())
Console.WriteLine(sonlar.First(Function(s) s > 10))
Console.WriteLine(sonlar.FirstOrDefault(Function(s) s > 100))
Console.WriteLine(sonlar.Last())
Dim topildi = sonlar.FirstOrDefault(Function(s) s > 100)
If topildi = 0 Then
Console.WriteLine("100 dan katta son yo'q")
End If
End Sub
End Module
4
17
0
23
100 dan katta son yo'q
First shartga mos element topmasa, InvalidOperationException
ko'taradi.
FirstOrDefault esa standart qiymat qaytaradi: sonlar uchun 0,
obyektlar uchun Nothing.
Diqqat: 0 ham haqiqiy qiymat bo'lishi mumkin. Shuning uchun
ro'yxatda 0 bo'lishi ehtimoli bo'lsa, Any bilan oldin tekshirish
to'g'riroq.
Kechiktirilgan bajarilish #
Module Dastur
Sub Main()
Dim royxat As New List(Of Integer) From {1, 2, 3}
Dim soroq = From s In royxat Where s > 1 Select s
royxat.Add(10)
Console.WriteLine(String.Join(", ", soroq))
End Sub
End Module
2, 3, 10
10 qayerdan keldi? So'rov e'lon qilinganda bajarilmaydi - u
faqat natija kerak bo'lganda ishlaydi. String.Join chaqirilgan
paytda ro'yxatda allaqachon 10 bor edi.
Bu foydali: so'rovni yozib qo'yib, keyin ishlatish mumkin.
Lekin xavfli ham: so'rov har safar qaytadan bajariladi. Uni uch marta aylantirsangiz, uch marta hisoblanadi.
Natijani qotirib qo'yish uchun .ToList() yoki .ToArray()
chaqiring - shunda so'rov bir marta bajariladi va natija saqlanadi.
Module Dastur
Sub Main()
Dim royxat As New List(Of Integer) From {1, 2, 3}
Dim qotirilgan = (From s In royxat Where s > 1 Select s).ToList()
royxat.Add(10)
Console.WriteLine(String.Join(", ", qotirilgan))
End Sub
End Module
2, 3
Endi 10 yo'q - chunki ToList() so'rovni o'sha zahoti
bajardi.
- Sonlar massividan juftlarini
Wherebilan ajrating. - Ularni kamayish tartibida saralang.
- Talabalar ro'yxatidan ball 80 dan yuqorilarini toping.
Selectbilan faqat ismlar ro'yxatini yasang.- Anonim tur bilan nom va umumiy narxni chiqaring.
- Talabalarni guruh bo'yicha guruhlab, sonini chiqaring.
- Bir so'rovni ikkala shaklda ham yozing.
AnyvaAllfarqini misol bilan ko'rsating.FirstvaFirstOrDefaultni bo'sh natijada sinang.ToList()ning kechiktirilgan bajarilishga ta'sirini isbotlang.
Xulosa #
- VB ning so'rov sintaksisi
SQLga o'xshaydi:From ... Where ... Order By ... Select. Select Nomi = ..., Jami = ...- anonim tur yaratadi.Group ... By ... Into Groupguruhlaydi; tartib uchunOrder Byqo'shing.- Metod shakli (
.Where(Function(x) ...)) bir xil ishlaydi; oddiy so'rovlar uchun qisqaroq. Count,Sum,Average,Any,All- eng ko'p ishlatiladigan yig'ma amallar.Firsttopmasa xato beradi,FirstOrDefaultstandart qiymat qaytaradi.- So'rov kechiktirib bajariladi - natijani qotirish uchun
ToList().
Keyingi bo'limda delegatlar, lambda va hodisalarni ko'ramiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.