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.

🕑 12 daqiqa o‘qish 📄 590 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Birinchi so'rov
  2. Saralash
  3. Obyektlar bilan
  4. Yangi shakl yasash
  5. Guruhlash
  6. Metod shakli
  7. Yig'ma amallar
  8. First, FirstOrDefault va Single
  9. Kechiktirilgan bajarilish
  10. Xulosa

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 #

VB
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
Natija
17, 23, 15, 42

O'qilishi: "sonlar ichidan har bir s ni ol, agar s 10 dan katta bo'lsa, s ni tanla".

Saralash #

VB
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
Natija
4, 8, 9, 15, 17, 23, 42
42, 23, 17, 15, 9, 8, 4

Obyektlar bilan #

VB
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
Natija
Aziza (95)
Husanboy (92)
Malika (88)

Yangi shakl yasash #

VB
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
Natija
Olma     480000
Anor     270000
Uzum     176000

Select Nomi = ..., Jami = ... - anonim tur yaratadi. Sinf e'lon qilmasdan, faqat kerakli maydonlardan iborat vaqtinchalik obyekt.

Guruhlash #

VB
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
Natija
A-guruh: 3 talaba, o'rtacha 74.7
B-guruh: 2 talaba, o'rtacha 93.5
Guruhlash tartibini o'zingiz belgilang

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:

VB
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
Natija
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.

VazifaSo'rov shakliMetod shakli
FiltrlashWhere s > 10.Where(Function(s) s > 10)
TanlashSelect s.Ism.Select(Function(s) s.Ism)
SaralashOrder By s.OrderBy(Function(s) s)
GuruhlashGroup ... Into.GroupBy(...)
Qaysi shaklni tanlash

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 #

VB
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
Natija
5
411
95
61
82.2
3
True
True
MetodNima qaytaradi
CountSoni (shart bilan ham)
Sum / AverageYig'indi / o'rtacha
Max / MinEng katta / kichik
AnyHech bo'lmaganda bittasi mos keladimi
AllHammasi mos keladimi

First, FirstOrDefault va Single #

VB
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
Natija
4
17
0
23
100 dan katta son yo'q
First topmasa dasturni to'xtatadi

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 #

VB
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
Natija
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.

Kechiktirilgan bajarilish - ikki yuzli

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.

VB
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
Natija
2, 3

Endi 10 yo'q - chunki ToList() so'rovni o'sha zahoti bajardi.

Amaliy topshiriq
  1. Sonlar massividan juftlarini Where bilan ajrating.
  2. Ularni kamayish tartibida saralang.
  3. Talabalar ro'yxatidan ball 80 dan yuqorilarini toping.
  4. Select bilan faqat ismlar ro'yxatini yasang.
  5. Anonim tur bilan nom va umumiy narxni chiqaring.
  6. Talabalarni guruh bo'yicha guruhlab, sonini chiqaring.
  7. Bir so'rovni ikkala shaklda ham yozing.
  8. Any va All farqini misol bilan ko'rsating.
  9. First va FirstOrDefault ni bo'sh natijada sinang.
  10. ToList() ning kechiktirilgan bajarilishga ta'sirini isbotlang.

Xulosa #

  • VB ning so'rov sintaksisi SQL ga o'xshaydi: From ... Where ... Order By ... Select.
  • Select Nomi = ..., Jami = ... - anonim tur yaratadi.
  • Group ... By ... Into Group guruhlaydi; tartib uchun Order By qo'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.
  • First topmasa xato beradi, FirstOrDefault standart qiymat qaytaradi.
  • So'rov kechiktirib bajariladi - natijani qotirish uchun ToList().

Keyingi bo'limda delegatlar, lambda va hodisalarni ko'ramiz.

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.