2008年3月14日星期五

LINQ 學習筆記 - LINQ to SQL

記得當時ADO.NET出現其中的一個目的,就是要提供一個Layer可以Offline作業,事實上利用DataSet, DataTable般的In-memory資料集合,的確對Server和程式本身有不少的好處。

LINQ to SQL是LinQ架構下重要的子集,在LINQ Providers中,可以大致分為 :
  1. LINQ to Objects
  2. LINQ to XML
  3. LINQ to SQL
  4. LINQ to DataSets
透過LINQ to SQL,我們可以把整個資料庫轉換成Data Model,當中包含Table的結構,DataType等等。而Data Field本身亦會隨Table成為Member角色,而產生的DataContext亦充當了一個Gateway,例如以往我們使用SQL Command時,發生Command String錯誤,有時會是Remote Side 回存的SQL Exception,但使用LINQ to SQL後,在Design Time時,已經可能知道錯誤,這大大加強資料庫的可程式性。

現在我就示範如何去把Database轉成LINQ 上使用的Data Class。

我使用了SQL 2005的AdventureWorks Sample Database ,在Visual Studio中的Database Explorer加入資料連接 ,Right Click Project => Add New Item ,再選 [ LINQ to SQL Class ] ,之後就會新增一個dbml檔案。

我選用了Contact / Product / Customer / SalesOrderHeader / SalesOrderDetail 五個Table, 在Database Explorer 選取後,把它們Drag & Drop至中間的位置後,Visual Studio 便會自動建立Class至dbml檔案。

greenshot_2008-03-13_16-11-59.pnggreenshot_2008-03-13_16-29-21.png

新增一個Form , 隨意加入一個DataGridView和兩個ComboBox後,建立一個BuildGrid的程序,輸入Code之後,已經可以做到基本的DataBinding了。(如下圖)

greenshot_2008-03-13_16-32-26.png greenshot_2008-03-13_16-35-23.png

嚴格來說,只需要三行的程式碼就可以 :
DataClass.infodata1_DataContext dc = new LINQPlayer.DataClass.infodata1_DataContext();
var select = (from c in dc.Contact where c.ContactID != null select new { c.ContactID , c.NameStyle, Name = (c.Title + ' ' + c.FirstName + ' ' + c.MiddleName + ' ' + c.LastName), c.EmailAddress, c.Phone, c.ModifiedDate }).Take(Convert.ToInt32(cboTake.SelectedItem)).Skip(Convert.ToInt32(cboSkip.SelectedItem));
dgv1.DataSource = select;


不用如ADO.NET般建立SQL Connection ,因為在剛才建立的dbml檔案,內裡已經有Connection String,同時亦免除SQL Command, SQLDataReader 等等,因為當中的var select是Anonymous types , 具有直接存放Data Collection的能力。透過LinQ的Query Syntax,你可以使用屬於extension method,如[skip] , [take] 去做有條件性選擇。

greenshot_2008-03-13_16-49-10.png

作者 : 達Ming
最後更新 : 13-3-2008

原創文章 - 轉貼時請註明出處 : http://tatmingstudio.blogspot.com/2008/03/linq-linq-to-sql.html
(有錯請留言更正,多多指教)

沒有留言:

發佈留言