Bagikan melalui


Fitur C# yang Mendukung LINQ

Ekspresi kueri

Ekspresi kueri menggunakan sintaks deklaratif yang mirip dengan SQL atau XQuery untuk mengkueri melalui System.Collections.Generic.IEnumerable<T> koleksi. Pada waktu kompilasi, pengkompilasi mengonversi sintaks kueri ke panggilan metode ke implementasi penyedia LINQ dari metode kueri standar. Aplikasi mengontrol operator kueri standar yang berada dalam cakupan dengan menentukan namespace yang sesuai dengan using direktif. Ekspresi kueri berikut mengambil array string, mengelompokkannya sesuai dengan karakter pertama dalam string, dan mengurutkan grup.

var query = from str in stringArray
            group str by str[0] into stringGroup
            orderby stringGroup.Key
            select stringGroup;

Variabel yang ditik secara implisit (var)

Anda dapat menggunakan pengubah var untuk menginstruksikan pengkompilasi untuk menyimpulkan dan menetapkan jenis, seperti yang ditunjukkan di sini:

var number = 5;
var name = "Virginia";
var query = from str in stringArray
            where str[0] == 'm'
            select str;

Variabel yang dinyatakan sebagai var diketik dengan kuat, sama seperti variabel yang jenisnya Anda tentukan secara eksplisit. Menggunakan var memungkinkan untuk membuat jenis anonim, tetapi hanya untuk variabel lokal. Untuk informasi selengkapnya, lihat Variabel Lokal Berjenis Implisit.

Penginisialisasi objek dan koleksi

Penginisialisasi objek dan koleksi memungkinkan untuk menginisialisasi objek tanpa secara eksplisit memanggil konstruktor untuk objek. Anda biasanya menggunakan penginisialisasi dalam ekspresi kueri saat memproyeksikan data sumber ke dalam jenis data baru. Dengan asumsi kelas bernama Customer dengan publik Name dan Phone properti, Anda dapat menggunakan penginisialisasi objek seperti dalam kode berikut:

var cust = new Customer { Name = "Mike", Phone = "555-1212" };

Melanjutkan dengan kelas Anda Customer, asumsikan bahwa ada sumber data yang disebut IncomingOrders, dan bahwa untuk setiap pesanan dengan jumlah besar OrderSize, Anda ingin membuat sebuah Customer baru berdasarkan pesanan tersebut. Anda dapat menjalankan kueri LINQ pada sumber data ini dan menggunakan inisialisasi objek untuk mengisi koleksi:

var newLargeOrderCustomers = from o in IncomingOrders
                            where o.OrderSize > 5
                            select new Customer { Name = o.Name, Phone = o.Phone };

Sumber data tersebut mungkin memiliki lebih banyak properti yang ditentukan daripada kelas Customer seperti OrderSize, tetapi dengan inisialisasi objek, data yang dikembalikan dari kueri dibentuk menjadi jenis data yang diinginkan; Anda memilih data yang relevan dengan kelas Anda. Akibatnya, Anda sekarang memiliki System.Collections.Generic.IEnumerable<T> yang telah terisi dengan Customer baru yang Anda inginkan. Anda juga dapat menulis contoh sebelumnya dalam sintaks metode LINQ:

var newLargeOrderCustomers = IncomingOrders.Where(x => x.OrderSize > 5).Select(y => new Customer { Name = y.Name, Phone = y.Phone });

Dimulai dengan C# 12, Anda dapat menggunakan ekspresi koleksi untuk menginisialisasi koleksi.

Untuk informasi selengkapnya, lihat:

Jenis anonim

Pengompilasi membangun jenis anonim. Hanya pengkompilasi yang dapat mengakses nama jenis. Jenis anonim menyediakan cara mudah untuk mengelompokkan sekumpulan properti untuk sementara dalam hasil kueri tanpa harus menentukan jenis bernama terpisah. Anda menginisialisasi jenis anonim dengan ekspresi baru dan penginisialisasi objek, seperti yang ditunjukkan di sini:

select new {name = cust.Name, phone = cust.Phone};

Dimulai dengan C# 7, Anda dapat menggunakan tuple untuk membuat jenis yang tidak disebutkan namanya.

Anggota ekstensi

Anggota ekstensi adalah anggota statis dari kelas statis yang terkait dengan jenis yang disebut jenis penerima. Anda dapat memanggil anggota ekstensi seolah-olah itu adalah anggota jenis penerima. Fitur ini memungkinkan Anda untuk "menambahkan" anggota baru ke jenis yang ada tanpa benar-benar memodifikasinya. Operator kueri standar adalah sekumpulan metode ekstensi yang menyediakan fungsionalitas kueri LINQ untuk jenis apa pun yang mengimplementasikan IEnumerable<T>.

Ekspresi Lambda

Ekspresi lambda adalah fungsi sebaris yang menggunakan => operator untuk memisahkan parameter input dari isi fungsi dan dapat dikonversi pada waktu kompilasi ke delegasi atau pohon ekspresi. Dalam pemrograman LINQ, Anda menemukan ekspresi lambda saat melakukan panggilan metode langsung ke operator kueri standar.

Ekspresi sebagai data

Objek kueri dapat dikomposisikan, yang berarti Anda bisa mengembalikan kueri dari metode . Objek yang mewakili kueri tidak menyimpan koleksi yang dihasilkan, melainkan langkah-langkah untuk menghasilkan hasil saat diperlukan. Keuntungan mengembalikan objek kueri dari metode adalah Anda dapat menyusun atau memodifikasinya lebih lanjut. Oleh karena itu, setiap nilai pengembalian atau out parameter metode yang mengembalikan kueri juga harus memiliki jenis tersebut. Jika sebuah metode mewujudkan kueri menjadi tipe konkret List<T> atau Array, maka metode tersebut mengembalikan hasil kueri alih-alih kueri itu sendiri. Anda masih dapat menyusun atau mengubah variabel kueri yang dikembalikan dari metode .

Dalam contoh berikut, metode QueryMethod1 pertama mengembalikan kueri sebagai nilai pengembalian, dan metode QueryMethod2 kedua mengembalikan kueri sebagai out parameter (returnQ dalam contoh). Dalam kedua kasus, ini adalah kueri yang dikembalikan, bukan hasil kueri.

IEnumerable<string> QueryMethod1(int[] ints) =>
    from i in ints
    where i > 4
    select i.ToString();

void QueryMethod2(int[] ints, out IEnumerable<string> returnQ) =>
    returnQ = from i in ints
              where i < 4
              select i.ToString();

int[] nums = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ];

var myQuery1 = QueryMethod1(nums);

Perulangan berikut foreach menjalankan kueri myQuery1.

foreach (var s in myQuery1)
{
    Console.WriteLine(s);
}

Letakkan penunjuk mouse ke atas myQuery1 untuk melihat jenisnya.

Anda juga dapat menjalankan kueri yang dikembalikan dari QueryMethod1 secara langsung, tanpa menggunakan myQuery1.

foreach (var s in QueryMethod1(nums))
{
    Console.WriteLine(s);
}

Arahkan penunjuk mouse ke panggilan QueryMethod1 untuk melihat jenis pengembaliannya.

QueryMethod2 mengembalikan kueri sebagai nilai parameternya out :

QueryMethod2(nums, out IEnumerable<string> myQuery2);

// Execute the returned query.
foreach (var s in myQuery2)
{
    Console.WriteLine(s);
}

Anda bisa mengubah kueri dengan menggunakan komposisi kueri. Dalam hal ini, objek kueri sebelumnya digunakan untuk membuat objek kueri baru. Objek baru ini mengembalikan hasil yang berbeda dari objek kueri asli.

myQuery1 = from item in myQuery1
           orderby item descending
           select item;

// Execute the modified query.
Console.WriteLine("\nResults of executing modified myQuery1:");
foreach (var s in myQuery1)
{
    Console.WriteLine(s);
}