語言集成查詢
大多數應用都是以數據為中心的,然而大多數的數據倉庫是關系型數據庫。這些年,設計者和開發者設計了基于對象模型的應用程序。
對象來負責連接訪問數據的組件——稱為數據訪問層( DAL )。這里我們需要考慮三點:
- 一個應用程序所需要的所有數據可以不存儲在一個資源中。這個資源可以是關系型數據庫、業務對象、XML文件或者一個WEB服務器。
- 訪問內存中的對象要比訪問數據庫、XML文件中的數據更簡單,更廉價。
- 被訪問到的數據不是直接使用的,而是被轉存、排序、分組、修改等。
因此如果存在只是用幾行代碼就能實現輕易整合各種各樣的數據——可以整合來自不同源的數據,并且能夠執行基本的數據操作的工具,那將非常有用。
語言集成查詢( LINQ )就是上述那樣的一種工具。 LINQ 是 .NET Framework 3.5 的一個擴展集并且它的管理語言使查詢更類似于是一種對象。它定義了一種通用的語法和程序模型,使我們可以使用一種慣用的語法完成查找不同類型的數據。
相關操作像查找、工程、鏈接、分組、分區、集合操作等可以在 LINQ 中使用,并且在 .NET Framework 3.5 中的 C# 和 VB 編譯器支持 LINQ 的語法,這就使得它可以通過配置數據來存儲,而不需要求助于 ADO.NET。
舉個例子,在 Northwind 數據庫中查詢 Constomers 這張表,使用 C# 中的 LINQ ,代碼應該是這樣:
var data = from c in dataContext.Customers where c.Country == "Spain" select c;其中:
- from關鍵字邏輯上依次通過每個集合。
- 包含關鍵字where的表達式會比較集合中的每個對象。
- select聲明會選擇被比較出的對象加入到列表中并返回。
- 關鍵字var用于變量聲明。因為返回對象的準確類型不明確,它表明信息需要被動態的推測。
LINQ 查詢語句可以應用在任何繼承于 IEnumerable 的有數據支撐的類,這里 T 可以是任何一個數據類型,例如 List< Book >。
讓我們來看一個示例理解一下概念。示例中使用了如下類:Book.cs
public class Books { public string ID {get; set;} public string Title { get; set; } public decimal Price { get; set; } public DateTime DateOfRelease { get; set; } public static List<Books> GetBooks() { List<Books> list = new List<Books>(); list.Add(new Books { ID = "001", Price = 634.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "002", Price = 250.76m, DateOfRelease = Convert.ToDateTime("2011-08-15") }); list.Add(new Books { ID = "003", Price = 700.00m, DateOfRelease = Convert.ToDateTime("2011-02-05") }); list.Add(new Books { ID = "004", Price = 500.99m, DateOfRelease = Convert.ToDateTime("2011-12-31") }); list.Add(new Books { ID = "005", Price = 314.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "006", Price = 456.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "007", Price = 1000.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); return list; } }在 web 網頁中使用這個類要有簡單的標簽控制,來顯示書的標題。Page_Load 方法創建了一個書的列表并且通過使用 LINQ 查詢返回標題:
public partial class simplequery : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { List<Books> books = Books.GetBooks(); var booktitles = from b in books select b.Title; foreach (var title in booktitles) lblbooks.Text += String.Format("{0} <br />", title); } }當網頁被運行,標簽顯示查詢結果:
在 Page_Load 函數中添加代碼來用 join 子句處理在兩張表里完成查詢:
結果頁顯示如下:
查詢語句只返回那些頁數大于 500 的列:
返回的元組是:
查詢結果如下圖所示: