[技術] 第一個LINQ程式

  • 6307
  • 0
  • 2010-08-09

[LINQ] 第一個LINQ程式

在.NET Framework3.5中,新增了一項功能LINQ,

心中一定會有一個疑問,這個新功能是要用來做什麼的呢?

 

原來LINQ(Language-Integrated Query)是屬於O/R Mapping的技術。

O/R Mapping全名是Object Relational Mapping(物件與關聯式資料庫對應技術),

意即O/R Mapping將資料庫中的資料表視為一個集合

而每個資料列為一個物件,欄位則對應為物件的屬性

當我們透過O/R Mapping要將資料新增至資料庫時,

就可以把這些資料看成是一個一個的物件,

設定好這些物件的屬性後加到集合就可以了。

 

如此一來,我們以後要寫資料庫應用程式時,

透過O/R Mapping技術,它就會根據我們使用的資料庫的不同,

產生出不同的SQL指令存取資料庫,是不是很方便呢!!

 

目前O/R Mapping主要有兩大類,

一個是以Microsoft SQL server為主要資料庫的LINQ To SQL

另一個就是支援SQL以外其他資料庫的ADO.NET Entity Framework

To see is to believe!!

現在就來實作我的第一個LINQ程式,看看它有什麼神奇的地方。

 

1. 開啟一個主控台應用程式,並命名它。

主控台應用程式的特點就是結果會顯示在DOS畫面。

image

 

2. 在方案總管中的方案加入新增項目。

image

 

3. 在加入新項目的畫面中,選「LINQ to SQL類別」。

image

 

4. 此時會產生三個檔案:

FirstLINQ.dbml是XML格式,定義資料表與Entity class間的對應資訊。

FirstLINQ.dbml.layout也是XML格式,定義Entity class在LINQ To SQL Designer顯示的位置。

    FirstLINQ.designer.cs是程式檔,LINQ To SQL Designer將Entity class的程式碼產生在這。

image

從上面的畫面觀察LINQ To SQL Designer。

區塊1是Entity Class的設計區,

區塊2則是預儲程序設計區。

   這麼多區塊搞不清楚真正的用途是什麼,

那就暫時先不管LINQ To SQL Designer拉,

先連結到資料庫好了。

在伺服器總管裡,在「資料連接 」按右鍵,

選擇「加入資料連接 」。

 

5. 會出現資料庫連線設定的視窗,可以選擇「瀏覽」將我們的資料庫加進去。

image

image

 

6. 連線成功後,我們就可以在伺服器總管中看到我們剛剛加的資料庫。

回想剛剛不知道是什麼作用的LINQ To SQL Designer,

原來它提供了一個機制,

讓我們可以將要對應的資料表從伺服器總管拉到設計區中,

由LINQ To SQL Designer來產生對應的Entity class。

所以我就將Customer這個資料表拉到設計區中。

image 

從上面可以看到,Customer這個資料表有CustomerID、CompanyName、CustomerName和title四個屬性。

 

7. 在資料表裡輸入一些資料。

image

 

8. 接下來回到Program.cs開始寫程式。

首先,我想要找出CompanyName是「HXC」的Customer,並秀出他們的CustomerID、CompanyName、CustomerName。

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5:  
   6: namespace FirstLINQ
   7: {
   8:     class Program
   9:     {
  10:         static void Main(string[] args)
  11:         {
  12:             FirstLINQDataContext context = new FirstLINQDataContext();       
  13:             var result = from s1 in context.Customers where s1.CompanyName.Equals("HXC") select s1;
  14:             foreach (var item in result)
  15:                 Console.WriteLine(item.CustomerID + "," + item.CompanyName + "," + item.CustomerName);
  16:             Console.ReadLine();
  17:         }
  18:     }
  19: }

 

9. Comile的結果。

image

 

10. 再試試看找出CustomerID包含「37」的Customer,並秀出他們的CustomerID、CompanyName、CustomerName。

 

 

 

 

 

 

 

 

 

 

 

 

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5:  
   6: namespace FirstLINQ
   7: {
   8:     class Program
   9:     {
  10:         static void Main(string[] args)
  11:         {
  12:             FirstLINQDataContext context = new FirstLINQDataContext();       
  13:             var result = from s1 in context.Customers where s1.CustomerID.Contains("37") select s1;
  14:             foreach (var item in result)
  15:                 Console.WriteLine(item.CustomerID + "," + item.CompanyName + ", " + item.CustomerName);
  16:             Console.ReadLine();
  17:         }
  18:     }
  19: }

 

11. Comile的結果。

image

 

12. 從上兩隻程式中可發現,

       每個.dbml會產生一個繼承自DataContext的類別,即程式中建立的FirstLINQDataContext物件,

       其目的是要對應到資料庫。

 

13. 在寫的過程中,發現以前的查詢語法都是寫slect… from… where,

       在LINQ卻是以更直覺的方式from… where… select。

       從資料表中(from s1 in context.Customers)找出CompanyName是HXC的Customer( where s1.CompanyName.Equals("HXC") select s1;)。

       另一個比較特別的地方是var,

       var的型別是由它右邊的運算式所決定。

       如此一來我在寫查詢語法的時候,就讓compiler幫我決定var的型別就好了。

       不過var只能用在區域變數的宣告,不能用在函式參數或函式的傳回值裡。

       如果要觀察result變數,可以在foreach那行下中斷點。

       可看到下面的結果,它的值和型別。

image

 

14. 小結

      久違的一篇,經過這次測試後,LINQ好像不難上手也比較直覺,

      但LINQ還有一些特色像是Extension Method和Lambda Expression也滿重要的,

      之後將慢慢深入了解,哦~對了,架構也要記得更仔細研究一下!!