Entity Framework Part 7

Posted by Kamarudin • 3 minute read • Comments

Masih melanjutkan postingan sebelumnya, setelah data pembelian berhasil disimpan tentu suatu saat kita ingin menampilkan kembali data tersebut.

Sedikit berbeda dengan postingan yang disini, saya sudah mendemokan bagaimana Entity Framework melakukan query dari sebuah tabel.

Sedangkan pada postingan kali ini, kita akan melihat bagaimana Entity Framework melakukan query dari beberapa tabel sekaligus yang saling berhubungan.

Misal kita ingin menampilkan datanya dengan format seperti berikut :

1

Maka ada dua proses yang perlu kita lakukan :

  1. Mengambil data header (beli dan supplier)
  2. Mengambil data detail (item beli dan barang)

Untuk poin pertama, jika menggunakan query konvensional, perintah SQL SELECTnya seperti berikut :

SELECT Beli.Nota, Beli.Tanggal, Supplier.SupplierID, Supplier.NamaSupplier
FROM Supplier INNER JOIN Beli ON Supplier.SupplierID = Beli.SupplierID
WHERE Beli.Nota = 'N001'

2

Sedangkan poin kedua perintahnya seperti berikut :

SELECT Barang.BarangID, Barang.NamaBarang, ItemBeli.Jumlah, ItemBeli.HargaBeli, ItemBeli.HargaJual
FROM Barang INNER JOIN ItemBeli ON Barang.BarangID = ItemBeli.BarangID
WHERE ItemBeli.Nota = 'N001'

3

Selanjutnya kita tinggal implementasikan dalam bentuk kode program (menggunakan ADO.NET) dengan membuat dua buah method masing-masing dengan nama GetPembelianUsingADONET dan GetDetailPembelian.

Method GetPembelianUsingADONET akan mengeksekusi query pertama sedangkan query kedua akan dieksekusi oleh method GetDetailPembelian.

private static Beli GetPembelianUsingADONET(string nota)
{
    Beli beli = null;

    using (var conn = GetOpenConnection())
    {
        // ambil data header
        var sql = @"SELECT Beli.Nota, Beli.Tanggal, Supplier.SupplierID, Supplier.NamaSupplier
                    FROM Supplier INNER JOIN Beli ON Supplier.SupplierID = Beli.SupplierID
                    WHERE Beli.Nota = @1";

        using (var cmd = new SqlCommand(sql, conn))
        {
            cmd.Parameters.AddWithValue("@1", nota);

            using (var dtr = cmd.ExecuteReader())
            {
                if (dtr.Read())
                {
                    // mapping record ke objek supplier
                    var supplier = new Supplier
                    {
                        SupplierID = dtr["SupplierID"] is DBNull ? 0 : (int)dtr["SupplierID"],
                        NamaSupplier = dtr["NamaSupplier"] is DBNull ? string.Empty : (string)dtr["NamaSupplier"]
                    };

                    // mapping record ke objek beli
                    beli = new Beli();
                    beli.Nota = dtr["Nota"] is DBNull ? string.Empty : (string)dtr["Nota"];
                    beli.Tanggal = dtr["Tanggal"] is DBNull ? DateTime.MinValue : (DateTime)dtr["Tanggal"];
                    beli.Supplier = supplier; // hubungkan objek supplier dan beli
                }
            }
        }

        if (beli != null)
        {
            // ambil data detail
            var daftarItemBeli = GetDetailPembelian(nota, conn);
            beli.ItemBelis = daftarItemBeli; // hubungkan objek beli dg detail beli
        }
    }

    return beli;
}

private static IList<ItemBeli> GetDetailPembelian(string nota, SqlConnection conn)
{
    var daftarItemBeli = new List<ItemBeli>();

    var sql = @"SELECT Barang.BarangID, Barang.NamaBarang, ItemBeli.Jumlah, ItemBeli.HargaBeli, ItemBeli.HargaJual
                FROM Barang INNER JOIN ItemBeli ON Barang.BarangID = ItemBeli.BarangID
                WHERE ItemBeli.Nota = @1";
    using (var cmd = new SqlCommand(sql, conn))
    {
        cmd.Parameters.AddWithValue("@1", nota);

        using (var dtr = cmd.ExecuteReader())
        {
            while (dtr.Read())
            {
                // mapping record ke objek barang
                var barang = new Barang
                {
                    BarangID = dtr["BarangID"] is DBNull ? string.Empty : (string)dtr["BarangID"],
                    NamaBarang = dtr["NamaBarang"] is DBNull ? string.Empty : (string)dtr["NamaBarang"]
                };

                // mapping record ke objek item beli
                var itemBeli = new ItemBeli
                {
                    Barang = barang, // hubungkan barang dg item beli
                    Jumlah = dtr["Jumlah"] is DBNull ? 0 : (int)dtr["Jumlah"],
                    HargaBeli = dtr["HargaBeli"] is DBNull ? 0 : (int)dtr["HargaBeli"],
                    HargaJual = dtr["HargaJual"] is DBNull ? 0 : (int)dtr["HargaJual"]
                };

                daftarItemBeli.Add(itemBeli);
            }
        }
    }

    return daftarItemBeli;
}

Untuk mencoba kode di atas gunakan kode berikut :

static void Main(string[] args)
{
    var beli = GetPembelianUsingADONET("N001");
    Console.WriteLine("Nota : {0}\nTanggal : {1}\nSupplier : {2}",
                        beli.Nota, beli.Tanggal, beli.Supplier.NamaSupplier);

    Console.WriteLine("\nItem Beli :");

    // ekstrak item beli
    foreach (var item in beli.ItemBelis)
    {
        Console.WriteLine("Barang : {0}, Jumlah : {1}, Harga Jual : {2}",
                            item.Barang.NamaBarang, item.Jumlah, item.HargaJual);
    }

    Console.WriteLine("\nPress any key to exit ...");
    Console.ReadKey();
}

Jika kode di atas dijalankan akan menghasilkan output seperti gambar pertama.

Trus bagaimana dengan Entity Framework ?

Tool ORM seperti Entity Framework, dibuat untuk memudahkan hidup kita sebagai pengembang aplikasi. Hidup ini sudah susah kenapa harus dipersulit :grin:

Oke, kita akan tulis ulang kode di atas menggunakan Entity Framework.

private static Beli GetPembelianUsingEF(string nota)
{
    Beli beli;

    using (var db = new RetailContext())
    {
        beli = db.Belis
                 .Include(bl => bl.Supplier)
                 .Include(bl => bl.ItemBelis.Select(ib => ib.Barang))
                 .Where(bl => bl.Nota == nota)
                 .SingleOrDefault();
    }

    return beli;
}

Gimana lebih simple bukan ? :blush:

Dan ingat …

Semakin sedikit kode yang kita tulis, semakin sedikit juga bug yang dihasilkan dan semakin sedikit kode yang kita tulis, semakin mudah juga untuk melakukan maintenance.

Selamat MENCOBA :blush:

Comments