當 Visual Studio 2005遇上LINQ To SQL
文/黃忠成
前陣子,我發表了VS2005遇上LINQ一文,其實有件事我未告訴各位,不過我想許多人都已經猜到了吧?
我們既然能在VS 2005中呼叫.NET Framework 3.5的LINQ函式,那這也意味著,原來的VS 2005專案,能參考VS 2008所編譯出來的Assembly。
那這有何好處呢?很簡單,你不需要大費周章的在VS 2005中以土法煉鋼來呼叫LINQ函式,只要用Visual Studio 2008 Express版本(這是免費的,當然,你也可以用Visual Studio 2008 Team Suite/Team Developer等版本做到相同的事),將需要的函式寫成Assembly(類別庫),就能在Visual Studio 2005中呼叫該函式,最終得到LINQ的強大火力支援,同時!也保留了LINQ Expression。
就我猜想,會需要用到這種手法的情況有兩種,一種是只有Visual Studio 2005正式版,而沒有Visual Studio 2008付費版本,而又需要LINQ的功能。另一種是擁有舊有Visual Studio 2005專案,為了穩定性或是遷移之不可測性,不希望將整個專案移植到Visual Studio 2008中。
前面的VS 2005遇上LINQ一文中,已經詳述了如何於VS 2005中使用LINQ,以本文所提及的手法,你不需撰寫那些奇怪的函式呼叫,只要下載Visual Studio 2008 Express版本,就可以在類別庫中使用LINQ,然後在VS 2005專案中參考她們。所以,此處我就不再贅述一般LINQ的用法了,我將焦點放在LINQ To SQL上面。
首先,請使用Visual Studio 2008 Express來建立一個類別庫,然後加入LINQ To SQL類別項目,詳情可參考前一篇文章。
接著,於LINQ To SQL設計區中加入Customers資料表,然後新增一個類別檔案,名為NorthwindExt.cs,程式碼如下所示:
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace DALLib { partial class NorthwindDataContext { public List<Customers> GetCustomers() { return (from s1 in Customers select s1).ToList(); }
public List<Customers> GetCustomers(int startRowIndex, int maximumRows) { return (from s1 in Customers select s1).Skip(startRowIndex).Take(maximumRows).ToList(); }
public void UpdateCustomer(Customers old_data, Customers data) { Customers.Attach(data, old_data); SubmitChanges(); }
public void DeleteCustomer(Customers data) { Customers.Attach(data); Customers.DeleteOnSubmit(data); SubmitChanges(); }
public int GetRecordCount(int startRowIndex, int maximumRows) { return (from s1 in Customers select s1).Count(); } } } |
這是利用了partial class機制,於原來的LINQ To SQL產生類別中,添加了ObjectDataSource控件會用到的Select、Update及Delete函式,完成後編譯此類別庫。
接著以Visual Studio 2005建立一新網站,加入前述之類別庫所編譯出來之DLL為參考,於Default.aspx中放入一ObjectDataSource控件,設定其資料來源為DALLib.NorthwindDataContext。
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 344.25pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image001.png"></imagedata></shape>
設定SELECT Method。
<shape id="_x0000_i1026" style="WIDTH: 414.75pt; HEIGHT: 342.75pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image002.png"><font size="3"></font></imagedata></shape>
設定UPDATE Method。
<shape id="_x0000_i1027" style="WIDTH: 414.75pt; HEIGHT: 343.5pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image003.png"><font size="3"></font></imagedata></shape>
設定DELETE Method
<shape id="_x0000_i1028" style="WIDTH: 414.75pt; HEIGHT: 341.25pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image004.png"><font face="Calibri" size="3"></font></imagedata></shape>
最後設定ObjectDataSource之SelectCountMethod為GetRecordCount,OldValueParameterFormatString為old_{0},ConflectDetecting為CompareAllValues,EnablePaging為True。
<shape id="_x0000_i1029" style="WIDTH: 317.25pt; HEIGHT: 697.5pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image005.png"><font size="3"></font></imagedata></shape>
然後拖入一個GridView控件,繫結至此ObjectDataSource,啟用編輯、分頁、刪除等功能,執行後便可見到以下結果。
<shape id="_x0000_i1030" style="WIDTH: 349.5pt; HEIGHT: 322.5pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image006.png"></imagedata></shape>
你可以編輯資料,切頁與刪除資料。
那這究竟有何好處呢?如果你仔細看NorthwindExt.cs中的程式碼,會發現到,我使用了Skip與Take函式,而這是SQL Server 2005最有效率的ROW_NUMBER分頁機制,你不須像以前般自行處理分頁,LINQ To SQL已幫你做掉所有的事了,新增、修改、刪除亦是如此。
當然,有一點我們也不能忘記,Visual Studio 2008 Express預設使用的是檔案型SQL Server資料庫,所以若要改用伺服器級別的資料庫,那麼你必須掛載事件至ObjectDataSource的ObjectCreating事件,改變其ConnectionString。
protected void ObjectDataSource1_ObjectCreating(object sender, ObjectDataSourceEventArgs e) { e.ObjectInstance = new DALLib.NorthwindDataContext( "Data Source=JEFFRAY;Initial Catalog=Northwind;Integrated Security=True"); } |
Welcome To LINQ To SQL World ^_^