Bagikan melalui


Kinerja kueri berantai (LINQ ke XML)

Salah satu manfaat terpenting dari LINQ (dan LINQ ke XML) adalah bahwa kueri berantai dapat berfungsi sebaik satu kueri yang lebih besar dan lebih rumit daripada kueri berantai.

Kueri berantai adalah kueri yang menggunakan kueri lain sebagai sumbernya. Misalnya, dalam kode sederhana berikut, query2 memiliki query1 sebagai sumbernya:

XElement root = new XElement("Root",
    new XElement("Child", 1),
    new XElement("Child", 2),
    new XElement("Child", 3),
    new XElement("Child", 4)
);

var query1 = from x in root.Elements("Child")
             where (int)x >= 3
             select x;

var query2 = from e in query1
             where (int)e % 2 == 0
             select e;

foreach (var i in query2)
    Console.WriteLine("{0}", (int)i);
Dim root As New XElement("Root", New XElement("Child", 1), New XElement("Child", 2), New XElement("Child", 3), New XElement("Child", 4))

Dim query1 = From x In root.Elements("Child") Where CInt(x) >= 3x

Dim query2 = From e In query1 Where CInt(e) Mod 2 = 0e

For Each i As var In query2
    Console.WriteLine("{0}", CInt(i))
Next

Contoh ini menghasilkan output berikut:

4

Kueri berantai ini menyediakan profil performa yang sama dengan iterasi melalui daftar tertaut.

  • Sumbu Elements pada dasarnya memiliki kinerja yang setara dengan iterasi pada daftar tertaut. Elements diimplementasikan sebagai iterator dengan eksekusi yang ditangguhkan. Ini berarti bahwa ia melakukan beberapa pekerjaan selain melakukan iterasi melalui daftar yang ditautkan, seperti mengalokasikan objek iterator dan melacak status eksekusi. Pekerjaan ini dapat dibagi menjadi dua kategori: pekerjaan yang dilakukan pada saat iterator disiapkan, dan pekerjaan yang dilakukan selama setiap perulangan. Pekerjaan penyiapan adalah sejumlah kecil pekerjaan tetap dan pekerjaan yang dilakukan selama setiap iterasi sebanding dengan jumlah item dalam koleksi sumber.
  • Dalam query1, klausa where (Where di Visual Basic) menyebabkan kueri memanggil metode Where. Metode ini juga diimplementasikan sebagai iterator. Pekerjaan penyiapan terdiri dari membuat instans delegasi yang akan mereferensikan ekspresi lambda, ditambah pengaturan normal untuk iterator. Dengan setiap iterasi, delegasi dipanggil untuk menjalankan predikat. Pekerjaan penyiapan dan pekerjaan yang dilakukan selama setiap iterasi mirip dengan pekerjaan yang dilakukan saat melakukan iterasi melalui sumbu.
  • Di query1, klausa select menyebabkan kueri memanggil metode Select. Metode ini memiliki profil performa yang sama dengan Where metode .
  • Dalam query2, baik where klausa (Where dalam Visual Basic) dan select klausa memiliki profil performa yang sama seperti di query1.

Oleh karena itu iterasi melalui query2 berbanding lurus dengan jumlah item dalam sumber kueri pertama, dengan kata lain, waktu linier.

Untuk informasi selengkapnya tentang iterator, lihat hasil.

Untuk tutorial yang lebih rinci tentang menggabungkan kueri, lihat Tutorial: Menggabungkan Kueri (C#).