2008年3月14日 星期五

LINQ簡介

在.NET Framework 3.5版中,引進一個新的功能,稱之為
LINQ (Language INtegrated Query),能夠利用.NET程式語言進行物件的查詢。.NET的程式語言,像是C# 3.0 (Visual C# 2008)、Visual Basic 9.0 (Visual Basic 2008) 都可利用一個LINQ提供的查詢運算式(Query Expression)語法來整合查詢能力。

LINQ為C#、Visual Basic程式語言提供基本查詢的能力,使用類似SQL查詢的語法,透過from子句指定查詢來源;利用where子句設定篩選條件;透過Order by子句做排序;以Group by子句對資料分組,再利用select子句回傳資料。再者,LINQ查詢也支援複雜的join語法,讓你快快樂樂地在程式語言中,進行複雜的連結運算, 恣意搜尋資料。


LINQ包含以下部份:
  •  LINQ to Object:可查詢集合與陣列中的資料
  •  LINQ to DataSet:查詢DataSet/DataTable中的資料。
  •  LINQ to SQL:查詢或異動微軟SQL Server資料庫的資料。
  •  LINQ to XML:查詢XML節點。

其中對於資料庫存取最重要的就是LINQ to SQL與LINQ to DataSet:

LINQ to SQL
LINQ to SQL,可以利用類似SQL查詢的語法,在執行時期將關連式資料庫的資料庫視為物件,以進行管理及查詢。這個功能真是酷斃了,想像一下你在程式中,下個類 似SQL的直覺式語法,就可以查詢物件的資料、篩選資料、做排序,而且,你的用戶端機器還不需要裝一台SQL Server。

LINQ to SQL內建了物件與關聯式資料兩者之間對應的架構,讓程式設計師能夠建立對應於資料庫結構的.NET物件模型。有了物件模型後,便可透過LINQ語法來查詢、或修改其中的資訊。而建立對應到資料庫物件的物件模型此等雜工,就交由工具去幫你做。

LINQ to DataSet
ADO.NET 提供的DataSet與DataTable具備有將資料暫存在用戶端電腦上的能力。DataSet就如離線的資料庫一般,可以存放一到多個資料表,每個資 料表為一個DataTable物件。DataSet也可以描述資料表與資料表之間的關聯,以及一對一、一對多等特色。雖然DataSet與 DataTable提供一些方法,具備有篩選、搜尋資料的能力,但認真來說,這些功能稍嫌簡陋,缺乏彈性,若想要做一些複雜的查詢,往往不能靠 DataSet、DataTable來達成。

當你利用DataAdapter把資料載入DataSet之後,若需要查詢其中的資料,就可以使用LINQ to DataSet。程式設計師可以針對DataSet來撰寫LINQ查詢。

應用程式的支援
LINQ 可以支援資料繫結 (Data Binding) 功能,不僅在Windows表單程式中可以很方便利用托曳方式進行設定,快速設計出應用程式介面,也可以在ASP.NET 網頁中,利用附加在ASP.NET 3.5版中的LinqDataSource控制項,來設計支援LINQ功能的網頁。未來不管是設計任何一種類型的.NET程式都可以加入LINQ,讓查詢 變得更簡單,讓資料的截取變的更方便。

8 則留言:

Isaac 提到...

你好
謝謝你的教學
我有問題想問 LINQ TO SQL 是不是一定要用 LINQDataSource?

我明白用 LINQ TO SQL CLASS 可以自動GENERATE TSQL CODE 很放便

如果我只是想 RETRIEVE DATA
可不可以自己CREATE 一個 簡單的LINQDataSource?

謝謝你

米米貓學開發 提到...

使用LINQ to SQL不一定要使用LinqDataSource,您也可以直接使用程式碼,建立LINQ查詢,例如:

PubsDataContext db = new PubsDataContext();
IQueryable<publisher> pubList = from p in db.publishers
orderby p.pub_id descending
select p;
foreach (publisher p in pubList) {
Console.WriteLine("{0} - {1}", p.pub_id,p.pub_name);
foreach (title t in p.titles) {
Console.WriteLine(" {0} {1} - {2}", t.title_id,t.title1,t.price);
}
}

Isaac 提到...

謝謝你 米米貓

不好意思, 想問多一個問題.

文章中 提到
4. 在伺服器總管,Northwind.dbml檔案方案滑鼠右鍵,選取「View Code」,Visual Studio 2008將會建立一個Northwind.cs檔案,其中包含一個NorthwindDataContext部分類別的定義。

我可不可以自己建立這個
NorthwindDataContext();
而不用Northwind.dbml 的?
這樣便可以不行step 3
3. 開啟Server Explorer工具,連接到Northwind資料庫,然後將Region資料表拖曳到LINQ to SQL設計畫面左方的區塊之中。

這樣visual studio 便不用 connect server explorer 了
可以嗎?

因為可以用 connection string 來 connect 個database

唔好意思
我的問題可以有點亂
希望你能明白
謝謝你

米米貓學開發 提到...

我沒有這樣試過!
但是就理論而言 LINQ to SQL只是Visual Studio提供的ORM設計工具,幫你產生物件相關的程式碼,在LINQ的設計中,您也可以不需要依賴工具來產生物件的程式碼,因此,我認為只要程式碼沒有寫錯,應該沒有理由不能這樣做!

Isaac 提到...

謝謝你
明白了
等我嘗試下先

謝謝

匿名 提到...

請問什麼時候用Linq to SQL
什麼時候用Linq to DataSet呢?

米米貓學開發 提到...

LINQ to SQL:想用物件方式操作DB資料

Linq to DataSet:想查詢DataSet中資料,如進階join查詢時

匿名 提到...

感謝老師!!

總瀏覽量