Sebagian besar aplikasi berpusat pada data, namun sebagian besar gudang data adalah database relasional. Selama bertahun-tahun, desainer dan pengembang telah merancang aplikasi berdasarkan model objek.
Objek bertanggung jawab untuk menghubungkan komponen yang mengakses data - disebut Data Access Layer (DAL). Di sini kita perlu mempertimbangkan tiga hal:
Semua data yang dibutuhkan oleh suatu aplikasi tidak perlu disimpan dalam satu sumber daya. Sumber daya ini dapat berupa database relasional, objek bisnis, file XML, atau server WEB.
Mengakses objek di memori lebih sederhana dan murah dibandingkan mengakses data di database dan file XML.
Data yang diakses tidak digunakan secara langsung, tetapi dibuang, diurutkan, dikelompokkan, dimodifikasi, dll.
Jadi akan sangat berguna jika ada alat yang dapat dengan mudah mengintegrasikan semua jenis data hanya dengan beberapa baris kode – alat yang dapat mengintegrasikan data dari berbagai sumber dan mampu melakukan operasi data dasar.
Language Integrated Query (LINQ) adalah salah satu alat tersebut. LINQ adalah ekstensi dari .NET Framework 3.5 dan bahasa manajemennya membuat kueri lebih mirip objek. Ini mendefinisikan sintaks umum dan model program yang memungkinkan kita menggunakan sintaks idiomatik untuk menyelesaikan pencarian berbagai jenis data.
Operasi terkait seperti pencarian, proyek, tautan, grup, partisi, operasi set, dll. dapat digunakan di LINQ, dan kompiler C# dan VB di .NET Framework 3.5 mendukung sintaksis LINQ, yang memungkinkannya menyimpan data konfigurasi, tanpa menggunakan ADO.NET.
Misalnya, untuk menanyakan tabel Konsumen di database Northwind, menggunakan LINQ di C#, kodenya harus seperti berikut:
var data = dari c di dataContext.Customerswhere c.Country == "Spanyol"pilih c;
di dalam:
Kata kunci from secara logis melewati setiap koleksi secara berurutan.
Ekspresi yang mengandung kata kunci di mana membandingkan setiap objek dalam koleksi.
Pernyataan pilih akan memilih objek yang dibandingkan dan menambahkannya ke daftar dan mengembalikannya.
Kata kunci var digunakan untuk deklarasi variabel. Karena tipe pasti dari objek yang dikembalikan tidak jelas, hal ini menunjukkan bahwa informasi perlu disimpulkan secara dinamis.
Pernyataan kueri LINQ dapat diterapkan ke kelas apa pun yang didukung data yang mewarisi dari IEnumerable, dengan T dapat berupa tipe data apa pun, seperti Daftar<Buku>.
Mari kita lihat contoh untuk memahami konsepnya. Kelas berikut digunakan dalam contoh: Book.cs
Buku kelas publik{ ID string publik {dapatkan; set;} string publik Judul { dapatkan; } Harga desimal publik { dapatkan; Daftar<Buku> daftar = Daftar baru<Buku>(); daftar.Tambahkan(Buku baru { ID = "001", Judul = "Pemrograman dalam C#", Harga = 634,76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(Buku baru { ID = "002", Judul = "Belajar Jave dalam 30 hari", Harga = 250,76m, DateOfRelease = Convert.ToDateTime ("2011-08-15") }); list.Add(Buku baru { ID = "003", Judul = "Pemrograman dalam ASP.Net 4.0", Harga = 700,00m, DateOfRelease = Convert.ToDateTime("2011-02-05") }); Judul = "VB.Net Menjadi Mudah", Harga = 500,99m, DateOfRelease = Convert.ToDateTime("2011-12-31") }); list.Add(Buku baru { ID = "005", Judul = "Pemrograman dalam C", Harga = 314,76m, DateOfRelease = Convert.ToDateTime("2010- 02-05") }); list.Add(Buku baru { ID = "006", Judul = "Pemrograman dalam C++", Harga = 456,76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(Buku baru { ID = "007", Judul = "Pengembangan Basis Tanggal", Harga = 1000,76m, DateOfRelease = Konversi.ToDateTime("05-02-2010") }); daftar; }}
Gunakan kelas ini di halaman web untuk memiliki kontrol label sederhana untuk menampilkan judul buku. Metode Page_Load membuat daftar buku dan mengembalikan judul menggunakan query LINQ:
simplequery kelas parsial publik : System.Web.UI.Page{ protected void Page_Load(pengirim objek, EventArgs e) { Daftar<Buku> buku = Buku.GetBooks(); var judul buku = dari b dalam buku pilih b.Judul (; var judul dalam judul buku) lblbooks.Text += String.Format("{0} <br />", judul }}
Saat halaman web dijalankan, tag menampilkan hasil kueri:
Ekspresi LINQ di atas:
var booktitles = dari b di buku pilih b.Judul;
Setara dengan pernyataan SQL berikut:
PILIH Judul dari Buku
Selain operator yang digunakan selama ini, masih banyak operator lain yang mengeksekusi klausa query. Mari kita lihat beberapa operator dan klausa.
'Klausa gabungan' dalam SQL digunakan untuk menggabungkan dua tabel data dan menampilkan kumpulan data dalam kolom yang muncul di kedua tabel data. LINQ juga dapat mendukung fungsi ini. Untuk memeriksanya, tambahkan kelas lain bernama Saledetails.cs ke proyek sebelumnya:
detail penjualan kelas publik{ penjualan int publik { dapatkan; } halaman int publik { dapatkan; set; } ID string publik {dapatkan; set;} public static IEnumerable<Salesdetails> getsalesdetails() { Detail Penjualan[] sd = { Detail Penjualan baru { ID = "001", halaman=678, penjualan = 110000}, Detail Penjualan baru { ID = "002", halaman=789, penjualan = 60000}, Detail Penjualan baru { ID = "003", halaman=456, penjualan = 40000}, Detail Penjualan baru { ID = "004", halaman=900, penjualan = 80000}, Detail Penjualan baru { ID = "005", halaman=456, penjualan = 90000}, Detail Penjualan baru { ID = "006", halaman=870, penjualan = 50000}, Detail Penjualan baru { ID = "007", halaman=675, penjualan = 40000}, }; return sd.OfType<Salesdetails>();
Tambahkan kode pada fungsi Page_Load untuk menyelesaikan query pada dua tabel menggunakan pemrosesan klausa gabungan:
protected void Page_Load(pengirim objek, EventArgs e){ IEnumerable<Books> books = Books.GetBooks(); IEnumerable<Salesdetails> sales = Salesdetails.getsalesdetails(); var booktitles = dari b dalam buku bergabung dalam penjualan di b.ID sama dengan s.ID pilih new { Nama = b.Judul, Halaman = s.halaman }; judul buku) lblbuku.Teks += String.Format("{0} <br />", judul);}
Halaman hasil ditampilkan sebagai berikut:
Klausa Where memungkinkan kondisi pemfilteran ditambahkan ke kueri. Misalnya, jika Anda ingin mendapatkan bibliografi dengan lebih dari 500 halaman, Anda dapat mengubah handle pada metode Page_Load menjadi seperti ini:
var booktitles = dari b in books join s in sales on b.ID sama dengan s.ID dimana s.pages > 500 pilih new { Name = b.Title, Pages = s.pages };
Pernyataan kueri hanya mengembalikan kolom dengan jumlah halaman lebih dari 500:
Klausa ini memungkinkan hasil kueri diurutkan. Untuk menanyakan judul, nomor halaman, dan harga buku, serta mengurutkannya berdasarkan harga, tulis kode berikut di pegangan metode Page_Load:
var booktitles = dari b dalam buku gabung s dalam penjualan di b.ID sama dengan s.ID orderby b.Harga pilih baru { Nama = b.Judul, Halaman = s.halaman, Harga = b.Harga};
Tupel yang dikembalikan adalah:
Klausa let memungkinkan pendefinisian variabel dan menetapkan nilai yang dihitung dari data ke dalamnya. Misalnya untuk menghitung total nilai penjualan dari kedua nilai penjualan di atas, Anda perlu menghitungnya seperti ini:
TotalSale = Harga Buku * Penjualan
Untuk menyelesaikan persamaan ini, tambahkan cuplikan kode berikut ke pegangan metode Page_Load:
Klausa let memungkinkan pendefinisian variabel dan menetapkan nilai yang dihitung dari data ke dalamnya. Misalnya untuk menghitung total nilai penjualan dari kedua nilai penjualan di atas, Anda perlu menghitungnya seperti ini:
var booktitles = dari b di book join s in sales di b.ID sama dengan s.ID let totalprofit = (b.Price * s.sales) pilih new { Name = b.Title, TotalSale = totalprofit};
Hasil querynya seperti dibawah ini: