LINQ to SQL, Stored Procedure & Astoria
Pada posting sebelumnya, saya terhenti saat ingin mengeksekusi function (hasil dari import stored procedure) yang mengembalikan nilai non-entity. Sepertinya harus membaca lebih banyak lagi tentang EDM dan Astoria. Bagi yang punya banyak pengalaman dengan EDM dan Astoria, silakan tinggalkan pencerahan pada komentar, untuk menunjukkan saya ke arah yang benar :)
Tapi kebutuhan akan perlukan mengeksekusi stored procedure yang sudah tersedia di database tetap harus diselesaikan. Oleh karena itu saya coba menggantikan EDMX dengan DBML milik LINQ to SQL.
Langkah sampai dapat memanggil stored procedure via web browser bisa dibilang singkat. Setelah sebuah file DBML dibuat, dari Server Explorer, misal digunakan databae Northwind, browse bagian Stored Procedure dan pilih salah satu (atau semua) stored procedure yang ada kemudian drag-n-drop ke area Method Pane, seperti yang dilihat pada gambar.
Dan pada kode item ADO.NET Data Server (misal WebDataService.cs) dapat dibuat seperti berikut ini.
1: using System;
2: using System.Data.Services;
3: using System.Collections.Generic;
4: using System.Linq;
5: using System.ServiceModel.Web;
6: using System.Collections;
7:
8: [System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
9: public class WebDataService : DataService< DataClassesDataContext >
10: {
11: // This method is called only once to initialize service-wide policies.
12: public static void InitializeService(IDataServiceConfiguration config)
13: {
14: // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
15: // Examples:
16: config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
17: config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
18: config.UseVerboseErrors = true;
19: }
20:
21: [WebGet]
22: public List<Ten_Most_Expensive_ProductsResult> GetTopProducts()
23: {
24: DataClassesDataContext db = new DataClassesDataContext();
25: var query = db.Ten_Most_Expensive_Products();
26: return query.ToList();
27: }
28: }
Pada baris ke-22 dapat dilihat bagaimana method untuk menjalankan stored procedure yang ‘sudah menjadi’ method pada DBML. Dapat dilihat terdapat ‘tipe data’ baru dengan nama Ten_Monst_Expensive_ProductResult. Selanjutkan kita dapat memanggil method Ten_Most_Expensive_Products setelah sebuah instan dari data context dibuat. Setelah itu tinggal panggil ‘url’ seperti berikut ini pada web browser.
Contoh yang lain, kita bisa memanggil stored procedure CustOrderHist dengan parameter CustomerID sebagai input. Setelah stored procedure di drag ke Method Pane, sekarang tinggal ditambahkan method seperti berikut ini.
[WebGet]
public List<CustOrderHistResult> CustOrderHist(string customerID)
{
DataClassesDataContext db = new DataClassesDataContext();
var query = db.CustOrderHist(customerID);
return query.ToList();
}
Maka kita dapat memanggil method ini dengan cara berikut.
Posting selanjutnya akan didokumentasikan bagaimana mengkonsumsi ADO.NET Data Service dengan beberapa cara.