Minggu, 23 Februari 2014

Language Integrated Query - Bagian 1

1. Pengenalan LINQ
LINQ adalah singkatan dari Language Integrated Query. LINQ merupakan fitur baru yang ditambahkan pada .NET Framework 3.5 (Visual Studio 2008). Dengan menggunakan LINQ, kita dapat melakukan query pada berbagai bentuk data, yaitu XML (LINQ to XML), Database (LINQ-enabled ADO.NET: LINQ to SQL, LINQ to Dataset dan LINQ to Entities) dan Object (LINQ to Objects). Gambar dibawah ini memperlihatkan arsitektur LINQ di antara bahasa pemrograman dan 3 jenis data source (Object, Database, XML).


Arsitektur LINQ

Di dalam menggunakan LINQ, kita sering kali menemui penulisan kode seperti berikut :


var result = from c in Customers where c.City == "Boston" orderby c.LastName descending select new { c.FirstName, c.LastName, c.Address };

Isitilah-istilah yang digunakan pada baris kode di atas dapat dilihat pada gambar di bawah ini :




Tentunya penulisan baris-baris kode di atas sangat asing bagi kita yang belum pernah atau baru menggunakan Visual C# 3.0 / Visual Studio 2008. Ya, memang istilah-istilah di atas adalah fitur-fitur baru yang ditambahkan pada Visual C# 3.0 dan cara penulisan baris-baris kode seperti diatas digunakan dalam sintax query linq. Oleh karena itu, sebelum membahas lebih jauh mengenai LINQ ini, maka terlebih dahulu akan kita bahas fitur-fitur baru tersebut.

Automatic Properties
Dalam membuat class beserta properti-propertinya, kita biasa menuliskan dengan cara seperti di bawah ini :
    public class Point
    {
        private int _x;
        public int X
        {
            get { return _x; }
            set { _x = value; }
        }

        private int _y;
        public int Y
        {
            get { return _y; }
            set { _y = value; }
        }
    }
Namun pada C# 3.0 untuk membuat class seperti di atas, kita dapat melakukan penulisan kode yang lebih singkat :
 public class Point
 {
     public int X { get; set; }
     public int Y { get; set; }
 }

Penulisan kode di atas adalah memungkinkan, karena terdapat fitur Automatic Properties  pada C# 3.0 yang akan men-generate private field ketika melakukan operasi get/set.

Implicity Typed Local Variable
Dengan fitur ini, kita tidak perlu menyebutkan lagi tipe data variabel yang dideklarasikan, dengan syarat saat deklarasi variabel tersebut harus langsung diisi dengan nilai. Compiler C# akan secara otomatis mendeteksi dan menentukan tipe data variabel tersebut. Perhatikan baris kode berikut :
int i = 5;
string s = "Hello";
double d = 1.0;
int[] numbers = new int[] {1, 2, 3};
Dictionary<int,Order> orders = new Dictionary<int,Order>();
Pada C# 3.0, baris kode di atas bisa ditulis :
var i = 5;
var s = "Hello";
var d = 1.0;
var numbers = new int[] {1, 2, 3};
var orders = new Dictionary<int,Order>();
Bagaimana ?, kita tidak perlu mendeklarasikan tipe datanya lagi kan ?. Namun, kita tidak boleh mendeklarasikan variabel seperti ini :
var x;     // Error, no initializer to infer type from
var y = {1, 2, 3};   // Error, collection initializer not permitted
var z = null;        // Error, null type not permitted
var u = x => x + 1;  // Error, lambda expressions do not have a type
var v = v++;  // Error, initializer cannot refer to variable itself
Kita juga dapat menerapkan Implicity Typed Local Variable pada statemen for, yang dikenal dengan for-initializer seperti contoh berikut :
int[] numbers = { 1, 3, 5, 7, 9 };
foreach (var n in numbers) Console.WriteLine(n);

Catatan :
Deklarasi dari Typed Local Variable hanya dapat digunakan untuk :
- local-variable-declaration
- resource-acquisition (using statement)
- for-initializer
- foreach-statement

Object & Collection Initializers
Buat project baru (misalnya Initializers), kemudian di dalamnya tambahkan sebuah class (misalnya kita beri nama ObjectInitializers) :
    public class ObjectInitializer
    {
        int x, y;
 
        public int X 
        { 
            get { return x; }
            set { x = value; }
        }
 
        public int Y 
        { 
            get { return y; } 
            set { y = value; } 
        }
    }
 
Sekarang kita akan mencoba fitur Object Initializers, tuliskan kode program berikut di dalam class utama (Program.cs) :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Initializers
{
    class Program
    {
        static void Main(string[] args)
        {
            //Sebuah instance dari class ObjectInitializers,
            //dapat diciptakan dan di diinisialisasi seperti berikut
            var a = new ObjectInitializers { X = 0, Y = 1 };
 
            //Dahulu kita menggunakan cara berikut
            var _a = new ObjectInitializers();
            _a.X = 0;
            _a.Y = 1;
            var b = _a;
 
            //Tampilkan hasilnya ke layar konsol
            Console.WriteLine("Nilai a = " + a.X.ToString());
            Console.WriteLine("Nilai a = " + a.Y.ToString());
            Console.WriteLine("\nNilai b = " + b.X.ToString());
            Console.WriteLine("Nilai b = " + b.Y.ToString());
            Console.WriteLine("\nTekan Enter untuk keluar...");
            Console.ReadLine();
 
        }
    }
}
Yang kedua, kita akan mencoba Collection Initializer. Dengan fitur ini kita dapat langsung menuliskan kode seperti berikut (tulis di class Program.cs) :
List<Point> points = new List<Point>
{
    new Point { X = 2,  Y = 5 },
    new Point { X = 1, Y = -10 },
    new Point { X = 3, Y = 0 }
};


Extensions Methods
Extension Methods dideklarasikan dengan cara menentukan keyword this sebagai sebuah modifier pada parameter pertama dari method. Extension Methods hanya dapat dideklarasikan di dalam class-class static non-generic, non-nested.

Buat project baru bertipe console application, kemudian di dalamnya buat class baru dengan nama Extension.cs :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace contohExtensionMethod
{   
    public static class Extensions
    {
        public static int ToInt32(this string s)
        {
            return Int32.Parse(s);
        }
 
        public static T[] Slice<T>(this T[] source, int index, int count)
        {
            if (index < 0 || count < 0 || source.Length - index < count)
            {
                throw new ArgumentException();
            }
 
            T[] result = new T[count];
            Array.Copy(source, index, result, 0, count);
            return result;
        }
    }
}
 
Pada class utama (Program.cs), kita uji Extension Methods yang sudah kita buat :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace contohExtensionMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "1234";
            int integ1 = Extensions.ToInt32(str);
            int integ2 = str.ToInt32();   //Sama dengan Extensions.ToInt32(str)
 
            int[] digits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            int[] array1 = Extensions.Slice(digits, 4, 3);
            int[] array2 = digits.Slice(4, 3); //Sama dengan Extensions.Slice(digits, 4, 3)
 
            Console.WriteLine("Nilai integ1 = " + integ1.ToString());
            Console.WriteLine("Nilai integ2 = " + integ2.ToString());
 
            Console.WriteLine("\nNiali array1 = " + array1[1].ToString());
            Console.WriteLine("Niali array2 = " + array2[1].ToString());
            Console.WriteLine("\nTekan Enter untuk keluar...");
            Console.ReadLine();
        }                
    }
}

Query Syntax
Visual Studio menyediakan fitur full intellisense dan compile-time yang akan memeriksa sintax query yang di-support. Perhatikan contoh berikut ini :
var result = from c in Customers where c.City.StartsWith("B") orderby c.LastName select new { c.FirstName, c.LastName, c.Address };
Baris kode di atas sama dengan baris kode berikut :

     var result = Customers.Where(c => c.City.StartsWith("B"))
                .OrderBy(c => c.LastName)
                .Select(c => new { c.FirstName, c.LastName, c.Address });

Keuntungan menggunakan Sintax Query adalah bahwa kode bahasa yang digunakan menjadi lebih mudah di fahami. Perlu juga diketahui bahwa query expression dimulai dengan klausa from dan diakhiri dengan klausa select atau group.

Baiklah, demikian dulu pembahasan kita, pada tutorial selanjutnya insya Allah kita akan membahas tentang LINQ to Object.

sumber :
http://www.codeproject.com/Articles/19154/Understanding-LINQ-C
http://msdn.microsoft.com/en-us/library/bb308966.aspx
http://www.codeproject.com/Articles/22700/C-3-0-New-Language-Features-Part-1
http://www.codeproject.com/Articles/23174/C-3-0-New-Language-Features-Part-2

Tidak ada komentar:

Posting Komentar