Belajar LINQ dan Entity Framework(EF) di C#


Kali ini kita akan belajar bagaimana menggunakan LINQ untuk query data. Sebelum kita mulai, mari kita berkenalan dahulu dengan apa itu Entity Framework(EF) dan LINQ.


LINQ kepanjangan dari Language Integrated Query adalah keyword baru pada C# dan VB, ia terdapat pada .NET versi 3.5 ke atas. LINQ berupa query expression untuk memanipulasi data, anda dapat melakukan query ke berbagai macam data seperti ke database SQL Server (LINQ to SQL), ke object DataSet (LINQ to DataSet), ke entity (LINQ to Entity Framework), data XML (LINQ to XML) dan masih banyak lagi.
 
Entity Framework(EF) adalah ORM buatan Microsoft ia diluncurkan bersamaan dengan Microsoft Visual Studio 2010 dan .Net Framework versi 4.0. ORM itu sendiri adalah Object Relational Mapping, yaitu suatu alat yang digunakan untuk mapping objek-objek dalam database seperti tabel dan view menjadi class entity.
EF membantu mempercepat programmer dalam membangun sebuah aplikasi, karena ia akan membuatkan mapping objek-objek dalam database dan operasi dasar CRUD seperti insert, select, update dan delete secara otomatis.
Cukup sudah berkenalanya, sekarang kita langsung ke praktisnya bagaimana menggunakan kedua fitur tersebut. pada latihan ini saya menggunakan Visual Studio 2010 dan SQL server 2008 untuk databasenya. Pertama buka SQL Server anda buat database dengan nama Latihan1, selanjutnya buat table dengan nama Cars dengan struktur field sebagai berikut :


Struktur Table Cars
Buat field code sebagai primary key dengan identity specification adalah autoincrement.
Sekarang buka Visual Studio 2010 anda buat New Project pilih Windows Form Aplication, beri nama projek anda dengan nama Latihan1
 

 

Membuat Projek baru pada Visual Studio 2010
Pada Solusion Projek anda klik kanan Add Item, selanjutnya pilih ADO.Net Entity Data Model tekan tombol Add maka akan tampil jendela Entity Data Model Wizard, di jendela ini pilih Generate From Database kemudian klik tombol Next anda akan di pandu untuk membuat Connection String database untuk Model anda.

 
Jendela Connection String

Setelah membuat Connection String klik tombol Next kemudian centang table Cars dan klik tombol Finish. Build Projek anda dan saat ini anda sudah berhasil membuat class entity menggunakan EF.
 
Setelah Model selesai di buat saatnya untuk coding, buka Form1 di projek anda, beri nama header form-nya Latihan LINQ dan EF. Tambahkan komponen DataGridView ke Form dan empat Button ganti Properties Text-nya dengan nama masing-masing Refresh, Add, Update, Delete. 

Gambar Form1
 

Selanjutnya buat Form untuk entry data-nya dengan klik kanan Solusion Projek anda tambahkan Window Form. Ubah properties Text menjadi Entry Cars. Tambahkan empat komponen Label dan Textbox ke dalam Form serta satu Button. Ubah properties Text label-nya masing-masing Code, Merk, Type dan Made In. Ubah juga Properties name Textbok-nya masing-masing txtCode, txtMerk, txtType dan txtMade dan terakhir properties text untuk buttonya yaitu Save.


Gambar Form2 untuk Entry Cars


Kembali ke Form1 buka View Code untuk Form1, copas kode dibawah ini :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Latihan1
{
    public partial class Form1 : Form
    {
        //deklarasi class instan dari Latihan1Entity
        private Latihan1Entities ObjLatihan;
        public Form1( )
        {
            InitializeComponent();
            ObjLatihan = new Latihan1Entities();
            //binding dataGridView1 ke list Cars
            dataGridView1.DataSource = ObjLatihan.Cars.ToList();
        }
        //event untuk tombol Refresh
        private void button1_Click(object sender, EventArgs e)
        {
             dataGridView1.Refresh();   
        }
        //event untuk tombol Add
        private void button2_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2();
            frm.statusForm = 1;//flag untuk add data
            frm.ShowDialog();
        }
        //event untuk tombol update 
        private void button3_Click(object sender, EventArgs e)
        {
            int code = Convert.ToInt32(dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[0].Value);
            Form2 frm = new Form2();
            frm.statusForm = 2;//flag untuk update data
            frm.code = code; // code car yang akan di edit
            frm.ShowDialog();
        }
    }
}

Pada View Code Form2 copas kode dibawah ini :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Latihan1
{
    public partial class Form2 : Form
    {
        private Latihan1Entities ObjLatihan;
        private Car car = new Car();
        public Form2( )
        {
            InitializeComponent();
            ObjLatihan = new Latihan1Entities();
            
        }
        //membuat properti untuk mode form(insert/update
        public byte statusForm
        {
            get;
            set;
        }
        //membuat properti untuk code car(jika mode-nya 1 nilainya null
        //jika mode-nya 2 maka berisi code Car
        public int code
        {
            get;
            set;
        }
        //event untuk tombol Save
        private void button1_Click(object sender, EventArgs e)
        {
           //mode Form 1 maka Add data
           //jika bukan satu maka update data 
            if (statusForm == 1)
            {
                car.merk = txtMerk.Text;
                car.type = txtType.Text;
                car.made = txtMade.Text;

               //menambah object car baru di EF
                ObjLatihan.Cars.AddObject(car);
               //perintah save perubahan di EF karena ada data
               //baru yang ditambahkan  
               ObjLatihan.SaveChanges();
            }
            else
            {
                
                car.merk = txtMerk.Text;
                car.type = txtType.Text;
                car.made = txtMade.Text;
                //perintah save di EF karena ada perubahan data
                ObjLatihan.SaveChanges();
 
            }
            this.Close();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            if (code!=0)
            {
                //lamda expersion di LINQ untuk select data berdasarkan code
                car = ObjLatihan.Cars.SingleOrDefault(x => x.code == code);
                txtCode.Text = car.code.ToString();
                txtMerk.Text = car.merk;
                txtType.Text = car.type;
                txtMade.Text = car.made;

            }
        }
    }
}

Build dan Run project anda, SELAMAT MENCOBA...

Konversi Numerik Keterbilang

Seringkali kita menemukan di invoice, kwitansi atau surat bukti pembayaran lainnya. Nominal uang disamping ditulis dalam angka numerik juga ditulis dalam format terbilang. Misal 1.250.000,00 ditulis dalam format terbilang 'satu juta dua ratus lima puluh ribu rupiah'.

Untuk menyelesaikan masalah diatas berikut adalah sebuah modul program konversi terbilang menggunakan VB.Net.


Module ModTerbilang

Public Function TerbilangIndonesia(ByVal InputCurrency As String, _
Optional ByVal MataUang As String = "rupiah") As String
Dim strInput As String
Dim strBilangan As String
Dim strPecahan As String
On Error GoTo Pesan
Dim strValid As String
Dim huruf As String
Dim i As Integer
Dim AngkaTerbilang As String
'Periksa setiap karakter yg diketikkan ke kotak UserID
strValid = "1234567890."
For i% = 1 To Len(InputCurrency)
huruf = Chr(Asc(Mid(InputCurrency, i%, 1)))
If InStr(strValid, huruf) = 0 Then
AngkaTerbilang = Nothing
MsgBox("Harus karakter angka!", _
vbCritical, "Karakter Tidak Valid")

End If
Next i%

If InputCurrency = "" Then

End If
If Len(Trim(InputCurrency)) > 15 Then GoTo Pesan

strInput = CStr(InputCurrency) 'Konversi ke string
'Periksa apakah ada tanda "," jika ya berarti pecahan
If InStr(1, strInput, ".", vbBinaryCompare) Then

strBilangan = Left(strInput, InStr(1, strInput, ".", vbBinaryCompare) - 1)
'strBilangan = Right(strInput, InStr(1, strInput, ".", vbBinaryCompare) - 2)
strPecahan = Trim(Right(strInput, Len(strInput) - Len(strBilangan) - 1))

If MataUang <> "" Then

'- Mengatasi kemungkinan adanya nilai sen yang > 99 atau
' memiliki digit pecahan lebih dari 2 digit, maka pecahan
' tersebut dibulatkan ke kelipatan terdekat sebanyak 2 digit.
' Contoh: TerbilangDesimal("20,599") -> menampilkan MataUang
' dibulatkan menjadi: 20,60 -> dibaca menjadi:
' "Dua Puluh Rupiah Enam Puluh Sen" dan BUKAN:
' "Dua Puluh Rupiah Enam Sen".
' Hal ini berlaku hanya yg menampilkan MataUang.
If CLng(Trim(strPecahan)) > 99 Then
strInput = Format(Math.Round(CDbl(strInput), 2), "#0.00")
strPecahan = Format((Right(strInput, Len(strInput) - Len(strBilangan) - 1)), "00")
End If

'- Mengatasi kemungkinan jumlah digit sen yang hanya 1 angka.
' maka pecahan tersebut harus ditambahkan dengan nol virtual.
' Contoh: TerbilangDesimal("20,5") -> menampilkan MataUang
' dibulatkan menjadi: 20,5 -> dibaca menjadi:
' "Dua Puluh Rupiah Lima Puluh Sen" dan BUKAN:
' "Dua Puluh Rupiah Lima Sen".
' Hal ini berlaku hanya yg menampilkan MataUang.
If Len(Trim(strPecahan)) = 1 Then
strInput = Format(Math.Round(CDbl(strInput), 2), "#0.00")
strPecahan = Format((Right(strInput, Len(strInput) - Len(strBilangan) - 1)), "00")
End If

'Yang ini ditutup, untuk memperbaiki ejaan sesudah tanda
'koma (pecahan)...
'TerbilangDesimal = (KonversiBilangan(strBilangan) & "koma " & KonversiBilangan(strPecahan) & "rupiah")

'-------------------------------------------------------
'- Membetulkan ejaan untuk bilangan setelah tanda koma,
' sebelumnya menggunakan KonversiBilangan, kini memakai
' KonversiPecahan (setiap 1 angka dibaca satu per satu)
'- Membuat parameter "MataUang" yg bersifat opsional,
' di mana default-nya = "rupiah". Jika parameter ini
' dikosongkan dengan "" maka kata "rupiah" tidak muncul.

'- Menangani kemungkinan ejaan sen jika menggunakan
' mata uang rupiah, di mana nilai sen harus di antara
' mulai 1 dan 99. (Kemungkinan I)
' Contoh: TerbilangDesimal("20,99")
' "Dua Puluh Rupiah Sembilan Puluh Sembilan Sen".
'- Menangani kemungkinan ejaan desimal tanpa menggunakan
' mata uang rupiah, di mana nilai desimal dieja per satu
' karakter. (Kemungkinan II)
' Contoh: TerbilangDesimal("20,99", "")
' "Dua Puluh Koma Sembilan Sembilan")

'BANDINGKAN Kemungkinan I dan Kemungkinan II...

'MULAI PERIKSA >>>>>>
'Jika tanpa parameter MataUang (default), berarti akan
'menampilkan kata "Rupiah" dan perhatikan pula penanganan
'ejaan untuk sen. Lihat contoh Kemungkinan I di atas...

'Periksa lagi kemungkinan adanya angka: 20,00
'seharusnya: "Dua Puluh Rupiah"
' dan BUKAN "Dua Puluh Rupiah Sen"
'Jika pemeriksaan berikut ini tidak ada, maka 20,00
'akan dibaca dengan: "Dua Puluh Rupiah Sen"
If CLng(Trim(strPecahan)) = 0 Then
TerbilangIndonesia = (KonversiBilangan(strBilangan) & MataUang & " " & KonversiBilangan(strPecahan))
Else
TerbilangIndonesia = (KonversiBilangan(strBilangan) & MataUang & " " & KonversiBilangan(strPecahan) & "sen")
End If
Else
TerbilangIndonesia = (KonversiBilangan(strBilangan) & "koma " & KonversiPecahan(strPecahan))
End If

Else

TerbilangIndonesia = (KonversiBilangan(strInput))

End If
Exit Function
Pesan:
TerbilangIndonesia = "(maksimal 15 digit)"
End Function



Private Function KonversiPecahan(ByVal strAngka As String) As String
Dim i%, strJmlHuruf$, Urai$, Kar$
If strAngka = "" Then
KonversiPecahan = ""
End If
strJmlHuruf = Trim(strAngka)
Urai = ""
Kar = ""
For i = 1 To Len(strJmlHuruf)
'Tampung setiap satu karakter ke Kar
Kar = Mid(strAngka, i, 1)
Urai = Urai & Kata(CInt(Kar))
Next i
KonversiPecahan = Urai
End Function

Private Function Kata(ByVal angka As Byte) As String

Dim kata1 As String = ""
Select Case angka
Case 1 : kata1 = "satu "
Case 2 : kata1 = "dua "
Case 3 : kata1 = "tiga "
Case 4 : kata1 = "empat "
Case 5 : kata1 = "lima "
Case 6 : kata1 = "enam "
Case 7 : kata1 = "tujuh "
Case 8 : kata1 = "delapan "
Case 9 : kata1 = "sembilan "
Case 0 : kata1 = "nol "
End Select
Return kata1
End Function

Private Function KonversiBilangan(ByVal strAngka As String) As String
Dim strJmlHuruf As String
Dim intPecahan As Integer = 0
Dim strPecahan As String = ""
Dim Urai As String = ""
Dim Bil1 As String = ""
Dim strTot As String = ""
Dim Bil2 As String = ""
Dim X, Y, z As Integer

If strAngka = "" Then
KonversiBilangan = ""
End If

strJmlHuruf = Trim(strAngka)
X = 0
Y = 0
Urai = ""
While
 (X < x =" X" strtot =" Mid(strJmlHuruf," y =" Y" z =" 
Len(strJmlHuruf)" bil1 = "NOL " z =" 1" z =" 7" z =" 10" z =" 13)" bil1 =
 "satu " z =" 4)" x =" 1)" bil1 = "se" bil1 = "satu " z =" 2" z =" 5" z 
=" 8" z =" 11" z =" 14)" x =" X" strtot =" Mid(strJmlHuruf," z =" 
Len(strJmlHuruf)" bil2 = "" bil1 = "sepuluh " bil1 = "sebelas " bil1 = 
"dua belas " bil1 = "tiga belas " bil1 = "empat belas " bil1 = "lima 
belas " bil1 = "enam belas " bil1 = "tujuh belas " bil1 = "delapan belas
 " bil1 = "sembilan belas " bil1 = "se" bil1 = "dua " bil1 = "tiga " 
bil1 = "empat " bil1 = "lima " bil1 = "enam " bil1 = "tujuh " bil1 = 
"delapan " bil1 = "sembilan " bil1 = ""> 0) Then
If (z = 2 Or z = 5 Or z = 8 Or z = 11 Or z = 14) Then
Bil2 = "puluh "
ElseIf (z = 3 Or z = 6 Or z = 9 Or z = 12 Or z = 15) Then
Bil2 = "ratus "
Else
Bil2 = ""
End If
Else
Bil2 = ""
End If
If (Y > 0) Then
Select Case z
Case 4
Bil2 = Bil2 + "ribu "
Y = 0
Case 7
Bil2 = Bil2 + "juta "
Y = 0
Case 10
Bil2 = Bil2 + "milyar "
Y = 0
Case 13
Bil2 = Bil2 + "trilyun "
Y = 0
End Select
End If
Urai = Urai + Bil1 + Bil2
End While
KonversiBilangan = Urai
End Function

Private Function SpellDigit(ByVal strNumeric As Integer)
Dim cRet As String
On Error GoTo Pesan
cRet = ""
Select Case strNumeric
Case 0 : cRet = " zero"
Case 1 : cRet = " one"
Case 2 : cRet = " two"
Case 3 : cRet = " three"
Case 4 : cRet = " four"
Case 5 : cRet = " five"
Case 6 : cRet = " six"
Case 7 : cRet = " seven"
Case 8 : cRet = " eight"
Case 9 : cRet = " nine"
Case 10 : cRet = " ten"
Case 11 : cRet = " eleven"
Case 12 : cRet = " twelve"
Case 13 : cRet = " thirteen"
Case 14 : cRet = " fourteen"
Case 15 : cRet = " fifteen"
Case 16 : cRet = " sixteen"
Case 17 : cRet = " seventeen"
Case 18 : cRet = " eighteen"
Case 19 : cRet = " ninetieen"
Case 20 : cRet = " twenty"
Case 30 : cRet = " thirty"
Case 40 : cRet = " fourthy"
Case 50 : cRet = " fifty"
Case 60 : cRet = " sixty"
Case 70 : cRet = " seventy"
Case 80 : cRet = " eighty"
Case 90 : cRet = " ninety"
Case 100 : cRet = " one hundred"
Case 200 : cRet = " two hundred"
Case 300 : cRet = " three hundred"
Case 400 : cRet = " four hundred"
Case 500 : cRet = " five hundred"
Case 600 : cRet = " six hundred"
Case 700 : cRet = " seven hundred"
Case 800 : cRet = " eight hundred"
Case 900 : cRet = " nine hundred"
End Select
SpellDigit = cRet
Exit Function
Pesan:
SpellDigit = "(maksimal 9 digit)"
End Function

Private Function SpellUnit(ByVal strNumeric As Integer)
Dim cRet As String
Dim n100 As Integer
Dim n10 As Integer
Dim n1 As Integer
On Error GoTo Pesan
cRet = ""
n100 = Int(strNumeric / 100) * 100
n10 = Int((strNumeric - n100) / 10) * 10
n1 = (strNumeric - n100 - n10)
If n100 > 0 Then
cRet = SpellDigit(n100)
End If
If n10 > 0 Then
If n10 = 10 Then
cRet = cRet & SpellDigit(n10 + n1)
Else
cRet = cRet & SpellDigit(n10)
End If
End If
If n1 > 0 And n10 <> 10 Then
cRet = cRet & SpellDigit(n1)
End If
SpellUnit = cRet
Exit Function
Pesan:
SpellUnit = "(maksimal 9 digit)"
End Function

Public Function TerbilangInggris(ByVal strNumeric As String) As String
Dim cRet As String
Dim n1000000 As Long
Dim n1000 As Long
Dim n1 As Integer
Dim n0 As Integer
On Error GoTo Pesan
Dim strValid As String = ""
Dim huruf As String = ""
Dim i As Integer
'Periksa setiap karakter masukan
strValid = "1234567890.,"
For i% = 1 To Len(strNumeric)
huruf = Chr(Asc(Mid(strNumeric, i%, 1)))
If InStr(strValid, huruf) = 0 Then
MsgBox("Harus karakter angka!", _
vbCritical, "Karakter Tidak Valid")
TerbilangInggris = ""
End If
Next i%

If strNumeric = "" Then
TerbilangInggris = ""
End If
If Len(Trim(strNumeric)) > 9 Then GoTo Pesan

cRet = ""
n1000000 = Int(strNumeric / 1000000) * 1000000
n1000 = Int((strNumeric - n1000000) / 1000) * 1000
n1 = Int(strNumeric - n1000000 - n1000)
n0 = (strNumeric - n1000000 - n1000 - n1) * 100
If n1000000 > 0 Then
cRet = SpellUnit(n1000000 / 1000000) & " million"
End If
If n1000 > 0 Then
cRet = cRet & SpellUnit(n1000 / 1000) & " thousand"
End If
If n1 > 0 Then
cRet = cRet & SpellUnit(n1)
End If
If n0 > 0 Then
cRet = cRet & " and cents" & SpellUnit(n0)
End If
TerbilangInggris = cRet & " only"
Exit Function
Pesan:
TerbilangInggris = "(maximum 9 digit)"
End Function

End Module