Halo ini adalah posting kesepuluh saya tentang fitur dari VB9
tentang LINQ Query. LINQ (Language Integrated Query) adalah fitur yang
mensupport sintaks query pada general purpose programming language,
anda dapat melakukan query ke berbagai sumber data seperti object,
Database, XML, dll. Mungkin anda sudah sering melihat kode-kode LINQ di
C#, nah kali ini saya akan mencoba mencontohkan versi VB-nya :)
anda dapat melihat posting saya sebelumnya:
- Implicitly typed local vaiable
- Object initializer
- Anonymous types
- Nullable types
- If Ternary operator
- Partial Method
- Extension Method
- Relaxed Delegates
- Lambda Expression
LINQ to Object / LINQ to Memory
Misal anda akan mengambil data dari object Array, anda dapat menuliskan kode:
Dim nilai() = {12, 34, 56, 11, 45, 66} Dim query = From n In nilai _ Where n Mod 2 = 0 _ Select n For Each bil In query Console.WriteLine(bil) Next
query diatas akan mengembalikan bilangan yang genap, anda dapat menuliskannya dalam bentuk Lambda sebagai berikut:
Dim query = nilai.Where(Function(x) x Mod 2 = 0).Select(Function(x) x) For Each bil In query Console.WriteLine(bil) Next
Object yang dapat diquery dengan LINQ harus bertipe IEnumerable(Of
T), Select() dan Where() adalah Extension Method yang ditambahkan ke
IEnumerable(Of T), asal dari Select() dan Where() sebenarnya dari
System.Linq.Enumerable, aslinya anda dapat menuliskan:
Dim query = Enumerable.Select(Enumerable.Where(nilai, Function(x) x Mod 2 = 0), Function(x) x) For Each bil In query Console.WriteLine(bil) Next
LINQ to SQL
Selain query ke object, anda dapat juga melakukan query ke database
SQL Server, menggunakan OR Mapping tools yang bernama LINQ to SQL. ORM
digunakan untuk mapping dari database relational ke object. Misal anda
mempunyai database dengan nama MhsDb, kemudian dalam database tersebut
terdapat satu table dengan nama Mahasiswa dan fields berikut (nim
char(8) primary key, nama varchar(50), dan ipk float).
Pertama buat class dengan nama Mahasiswa.vb, kemudian mapping table Mahasiswa kedalam class:
Imports System.Data.Linq.Mapping <Table(Name:="dbo.Mahasiswa")> _ Public Class Mahasiswa Private _nim As String <Column(IsPrimaryKey:=True)> _ Public Property Nim() As String Get Return _nim End Get Set(ByVal value As String) _nim = value End Set End Property Private _nama As String <Column()> _ Public Property Nama() As String Get Return _nama End Get Set(ByVal value As String) _nama = value End Set End Property Private _ipk As Single <Column()> _ Public Property Ipk() As Double Get Return _ipk End Get Set(ByVal value As Double) _ipk = value End Set End Property End Class
Anda dapat juga melakukan mapping secara otomatis menggunakan fasilitas “LINQ to SQL Class” atau “SQL Metal”.
Untuk mengakses data menggunakan LINQ to SQL kita harus membuat
object DataContext terlebih dahulu, kemudian ambil table yang akan kita
query
Imports System.Data Imports System.Linq Imports System.Data.Linq Sub Main() Dim strConn = "Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=MhsDb;" Dim db As New DataContext(strConn) Dim tMahasiswa = db.GetTable(Of Mahasiswa)() Dim query = From m In tMahasiswa _ Select m For Each mhs In query Console.WriteLine(mhs.Nim & " " & mhs.Nama & " " & mhs.Ipk) Next End Sub
LINQ Query Operator
Beberapa operator LINQ yang dapat digunakan adalah:
From : source dari query yang akan digunakan
From <tampung> [As<type>] In <source>
- tampung berisi variable tampung yang akan digunakan dalam query
- type berisi tipe data dari tampung (tapi tidak harus
disebutkan karena vb akan secara otomatis menggunakan local type
inference untuk menentukan tipenya). biasanya dapat berupa
IEnumerable(Of T) atau IQueryable(Of T) - source berisi referensi ke object source, dapat berupa in-memory collection atau IQueryable(Of T) object
Select : mendefinisikan projection clause dalam query
Select <projection>
- projection dapat berisi expression yang mengembalikan satu object,
dapat juga berupa tampung dari From clause, atau object yang lebih
kompleks.
[alias = ] <column>
- anda juga dapat mendefinisikan alias (sifatnya optional),
mengindikasikan nama dari property yang akan digenerate oleh anonymous
type yang mewakili projection. - column mengacu ke fields atau property pada tampung, tapi dapat juga berupa expression yang lebih kompleks
Contoh:
'mencetak 9 8 7 6 5 4 Dim bil = From i In New Integer() {9, 8, 7, 6, 5, 4} Select i For Each i In bil Console.WriteLine(i) Next 'menghasilkan anonymous type {Dobel=2,Tripel=3},{Dobel=4,Tripel=6} Dim bil2 = From i In New Integer() {1, 2} Select Dobel = 2 * i, Tripel = 3 * i For Each i In bil2 Console.WriteLine(i.Dobel & " " & i.Tripel) Next
Order By : digunakan untuk mengurutkan hasil query
Order By <ordering> [Ascending] [Descending]
- ordering berisi expression key yang digunakan untuk proses pengurutan
Contoh:
Dim mhs() = {New With {.Nim = "22081234", .IPK = 3.2}, _ New With {.Nim = "23081235", .IPK = 3.5}, _ New With {.Nim = "23081231", .IPK = 2.5}} Dim query = From m In mhs Order By m.Nim Acending Order By m.IPK Select m.Nim, m.IPK For Each m In query Console.WriteLine(m.Nim & " " & m.IPK) Next
Distinct : melakukan filter terhadap nilai yang terduplikasi dari query
Contoh:
'menghasilkan 1 2 3 4 Dim bil = From i In New Integer() {1, 1, 1, 2, 3, 4} Select i Distinct For Each b In bil Console.Write(b & " ") Next
Skip dan Take: untuk memfilter range dari nilai hasil query
Take<number> : poisisi
Skip <number> : banyak nilai yang diambil
Contoh:
'menghasilkan 5,6 (ambil dari posisi ke 4 sebanyak 2 nilai) Dim bil = From i In New Integer() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} _ Select i Skip (4) Take (2) For Each b In bil Console.Write(b & " ") Next
Aggregate : digunakan untuk operasi aggregation, contoh agregation
- Count
- Sum
- Min
- Max
- Average
Aggregate <tampung> In <source> Into <aggregation list>
Contoh:
'penggunaan Sum Dim tot = Aggregate i In (From i In New Integer() {1, 2, 3, 4, 5, 6} Select i) Into Total = Sum() Console.WriteLine(tot)
'penggunaan Count Dim jml = Aggregate i In (From i In New Integer() {1, 2, 3, 4, 5, 6} Select i) Into Jumlah = Count() Console.WriteLine(jml)
'penggunaan Min Dim min = Aggregate i In (From i In New Integer() {1, 2, 3, 4, 5, 6} Select i) Into Minimal = Min() Console.WriteLine(min)
'penggunaan Average Dim rata = Aggregate i In (From i In New Integer() {1, 2, 3, 4, 5, 6} Select i) Into Minimal = Average() Console.WriteLine(rata)
Grouping : digunakan untuk membuat group berdasarkan group expression yang dibuat
Group By <key> Into Aggregate
Contoh:
Dim mhs() = {New With {.Nim = "22081234", .Jurusan = "TI", .IPK = 3.2}, _ New With {.Nim = "23081235", .Jurusan = "SI", .IPK = 3.5}, _ New With {.Nim = "23081231", .Jurusan = "SI", .IPK = 2.5}} Dim query = From m In mhs Group By m.Jurusan Into Anggota = Group For Each jur In query Console.WriteLine(jur.Jurusan) For Each m In jur.Anggota Console.WriteLine("- NIM :" & m.Nim & " IPK :" & m.IPK) Next Next
Join : menggabungkan multiple source bersama berdasarkan kondisi join tertentu
Join <tampung> In <source> On <key1> equals <key2> and ….
Dim mhs() = {New With {.Nim = "22081234", .Jurusan = "TI", .IPK = 3.2}, _ New With {.Nim = "23081235", .Jurusan = "SI", .IPK = 3.5}, _ New With {.Nim = "23081231", .Jurusan = "SI", .IPK = 2.5}} Dim kul() = {New With {.Kode = "IM2043", .Nama = "Web Database"}, _ New With {.Kode = "IM2033", .Nama = "Rekayasa Web"}} Dim ambil() = {New With {.Id = 1, .Kode = "IM2043", .Nim = "22081234"}, _ New With {.Id = 2, .Kode = "IM2033", .Nim = "23081235"}, _ New With {.Id = 3, .Kode = "IM2043", .Nim = "23081231"}} Dim query = From m In mhs _ Join a In ambil On m.Nim Equals a.Nim _ Join k In kul On a.Kode Equals k.Kode _ Select m.Nim, k.Nama For Each hsl In query Console.WriteLine("Mahasiswa dengan Nim : " & hsl.Nim & " mengambil Matakuliah : " & hsl.Nama) Next
demikian beberapa contoh penggunaan LINQ Query di VB9, untuk
contoh-contoh lebih detail tentang penggunaan LINQ (VB) akan dibahas di
posting2 selanjutnya, viva VB :)