Fitur VB9 (LINQ Query)

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:

 

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 :)

Share this post: | | | |
Published Wednesday, April 08, 2009 10:51 PM by Erick Kurniawan
Filed under: , , , ,

Comments

No Comments
Powered by Community Server (Commercial Edition), by Telligent Systems