Sekilas LINQ
LINQ merupakan singkatan dari Language Integrated Query. LINQ merupakan fitur yang sudah ada sejak .Net Framework v3.5. Yang menjadi pertanyaan sekarang adalah, mengapa kita mempelajari LINQ? Bagaimana pula nasib T-SQL yang sudah kita mengerti bahkan sudah hafal luar kepala?
Sekarang ini, perkembangan teknologi sudah semakin maju, banyak pilihan manipulasi data, bahkan dalam sebuah aplikasi, kita harus memahami sintaks sql untuk memanipulasi database, selain itu kita juga harus mengerti xpath, xquery dan xslt jika berurusan dengan XML. Lain lagi dengan programmer yang bekerja dengan datasets, yang harus mengerti berbagai macam class dan property yang bisa digunakan dari ADO.Net.
Hal-hal tersebutlah yang menjadi dasar dan dorongan untuk menjadikan LINQ sebagai satu kesatuan cara pandang dari pengelolaan data… (ampun, bahasanya ribet)
Arsitektur LINQ
Berikut ini adalah diagram dari arsitektur LINQ :
Dari gambar di atas, dapat dilihat bahwa LINQ dapat mengakses data source dari berbagai sumber:
- LINQ to Objects, sumber data dari IENumerable dan IQueryable generic collection.
- LINQ to XML, sumber data dari IENumerable Xelement.
- LINQ to Dataset, sumber data dari IENumerable Datarow
- LINQ to SQL, sumber data dari IENumerable dan IQueryable dan setiap object yang kita tentukan sendiri sebagai represent data dari SQL tabel.
Mari kita bahas satu per satu…
LINQ to Objects
LINQ to Objects dapat mengakses sumber data IENumerable atau IEQueryable secara langsung tanpa membutuhkan LINQ Provider atau API, seperti pada LINQ to SQL atau LINQ to XML. IENumerable atau IEQueryable collection contohnya adalah array string (string()), array integer (integer()), bisa pula generic List.
Langsung aja masuk ke contoh, misalkan anda memiliki kumpulan data dalam sebuah array. Untuk mengakses data pada array, biasanya kita melakukan looping pada array tersebut dan melakukan iterasi pada setiap data yang sesuai dengan kriteria, misalnya nama sebuah makanan yang dimulai dengan huruf tertentu.
Di bawah ini adalah script vb.net untuk menampilkan data pada listbox dengan menggunakan pengulangan:
Dim makanan() As String = {"Pecel", "Gudeg", "Kerupuk", "Pizza", "Pisang Goreng", "Gadogado", "Sari roti", "Oreo", "Martabak"} ListBox1.Items.Clear() For Each strMakanan In makanan If strMakanan.StartsWith("P") Then ListBox1.Items.Add(strMakanan) End If Next
Pada sepenggal script vb di atas, kebiasaan kita untuk mengakses data terhadap array dengan menggunakan looping. Kita juga melakukan iterasi dan melakukan pengkondisian terhadap nama makanan yang dimulai dari huruf "P" dengan menggunakan fungsi StartsWith.
Nah, dengan LINQ to Objects, kita modifikasi script di atas menjadi :
Dim makanan() As String = {"Pecel", "Gudeg", "Kerupuk", "Pizza", "Pisang Goreng", "Gadogado", "Sari roti", "Oreo", "Martabak"}
ListBox1.Items.Clear()
Dim linqMakanan As IEnumerable(Of String) = From namaMakanan In makanan Select namaMakanan _
Where namaMakanan.StartsWith("P")
For Each strMakanan In linqMakanan
ListBox1.Items.Add(strMakanan)
Next
Sekarang mari kita bangingkan antara kedua script di atas. Script yang pertama menyelesaikan masalah dengan melakukan pengkondisian "If". Dan script yang kedua, menyelesaikan masalah dengan cara query (melakukan filtering "Where").
Selanjutnya pada bagian looping for each. Paradigma orang awam: "Sama aja tuh, di atas pake for each, yang bawah juga pake for each". Kalau saya bilang tidak sama, for each yang di atas melakukan iterasi terhadap semua elemen yang berada di dalam array makanan(). sementara for each yang di bawah, hanya melakukan iterasi pada data yang sudah terfilter. Sudah bisa dilihat kan bedanya? Dan tentunya sudah dapat dibayangkan, yang mana yang lebih cepat dalam hal mengakses dan mempresentasikan data.
Nah, sekarang kita melakukan pembahasan terhadap sintax LINQ. Mungkin para pembaca yang sudah mengerti dan paham luar dalam sintaks SQL, menyadari kalau penulisan sintax LINQ mirip-mirip dengan sintax SQL. Perbedaan yang mendasar adalah operator sequens yang berbalik. Dimana SQL sintax memiliki faham SELECT – FROM – WHERE, sementara LINQ memiliki faham FROM – WHERE – SELECT (hmm, jadi kebayang format DM – MD di pelajaran bahasa). Kenapa pada LINQ sintax terbalik dengan SQL sintax? Jawabannya adalah agar supaya (kayak bahasa pak Jendral) intellisense dapat mengetahui sumber data mana yang akan kita gunakan. Sehingga intellisense dapat memberikan dan menyediakan saran/suggest untuk "where" clause dan "select" clause.
Pada sepenggal script LINQ di atas, yang dihasilkan adalah IENumerable String. Bisa saja kita melakukannya secara implisit seperti ini:
Dim linqMakanan = From namaMakanan In makanan Select namaMakanan _
Where namaMakanan.StartsWith("P")
Pada script di atas, compiler akan secara otomatis menentukan tipe yang cocok, tidak masalah mau secara implisit atau sudah ditentukan.
LINQ akan lebih berguna lagi jika kita ingin memfilter data yang lebih kompleks. Pada contoh di atas, kita memfilter nama makanan yang huruf depannya adalah "P". Pada LINQ, kita bisa melakukan filtering yang lain, misalnya nama makanan yang huruf depan adalah "P" dan huruf akhir adalah "l".
Dim linqMakanan = From namaMakanan In makanan Select namaMakanan _
Where namaMakanan.StartsWith("P") And namaMakanan.EndsWith("l")
dari sintax LINQ di atas akan menghasilkan "Pecel".
Query Syntax lawan Method Syntax
Syntax LINQ yang telah kita bahas di atas termasuk tipe Query Syntax. Query Syntax bersifat declarative manner.
Dim angka() As Integer = {10, 12, 52, 32, 41, 75, 8, 88, 98, 72, 55, 21, 66, 33, 44, 41}
Dim angkaGanjil As IEnumerable(Of Integer) = From bilGanjil In angka _
Select bilGanjil _
Where (bilGanjil Mod 2 = 1)
For Each ganjil In angkaGanjil
ListBox1.Items.Add(ganjil)
Next
Sedangkan method syntax ditulis dengan menggunakan pemanggilan method (seperti where dan select):
Dim angka() As Integer = {10, 12, 52, 32, 41, 75, 8, 88, 98, 72, 55, 21, 66, 33, 44, 41}
Dim angkaGanjil As IEnumerable(Of Integer) = angka.Where(Function(n) n Mod 2 = 1)
For Each ganjil In angkaGanjil
ListBox1.Items.Add(ganjil)
Next
Fungsi dari kedua script di atas sebenarnya sama, yaitu memfilter data dan mengembalikan angka ganjil dari kumpulan data. Pada script kedua, ada bagian seperti:angka.Where(Function(n) n Mod 2 = 1).
Function(n) ini disebut Lambda Expression. Lambda Expression adalah sebuah fungsi yang hanya menerima sebuah parameter input, terdiri dari 1 statement dan mengembalikan sebuah nilai (accpets single parameter input, contains single statement, returns a value)
Syntax tipe mana yang akan anda gunakan? Berdasarkan rumor yang beredar, di bawah ini adalah informasi perbandingan keduanya(berdasarkan buku C# 2008 Programmers Reference karangan Wei-Meng Lee):
1. Dari sisi performa, tidak ada perbedaan di antara kedua tipe syntax tersebut.
2. Query Syntax lebih mudah dibaca, jadi gunakanlah selagi memungkinkan.
3. Gunakanlah method syntax, jika tidak ada fungsi yang ekivalen di query syntax. Misalnya kita ingin menghitung berapa jumlah bilangan ganjil pada case di atas, kita menggunakan fungsi count.
Dim count As Integer = angka.Where(Function(n) n Mod 2 = 1).Count
Dimanakah anda sekarang?
Setelah membaca artikel saya yang ndak seberapa ini, seharusnya pembaca sudah mengerti mengenai:
– LINQ, singkatan dari apa, motivasi desain nya apa.
– Arsitektur LINQ yang meliputi LINQ to Objects, LINQ to XML, LINQ to Datasets dan LINQ to SQL
– Sintax LINQ dengan format FROM – WHERE – SELECT, yang berbanding terbalik dengan sintax SQL.
– Pemahaman dasar LINQ to Objects, pengaksesan data secara langsung terhadap IENumerable dan IQueryable.
– Bisa membedakan Query Syntax dan Method Syntax
– Sedikit mengetahui tentang Lambda
Selanjutnya kita akan membahas mengenai LINQ Extension Method dan LINQ to SQL. Tunggu tanggal mainnya.