一. LINQ 的變體
1. LINQ to Objects:為任意類型的C#內存對象提供查詢,例如數組、列表和其他集合類型。上一章的所有示例都使用LINQ to Objects。也可以把本章介紹的技巧應用于LINQ的所有變體。
2. LINQ to xml:提供了XML文檔的創建和處理功能,其語法與一般查詢機制和其他LINQ變體相同。
3. LINQ to ADO.NET:.NET的ADO.NET或Active Data Objects是一個統稱,囊括了.NET中訪問數據庫(例如Microsoft SQL Server、Oracle等)中的數據的所有不同的類和庫。LINQ to ADO.NET包括LINQ to Entities、LINQ to DataSet和LINQ to SQL。
4. LINQ to Entities:ADO.NET Entity Framework是.NET 4 中數據接口類的最新集合,Microsoft推薦使用它進行新的開發工作。本章將給Visual C#項目添加ADO.NET Entity Framework數據源,再使用LINQ to Entities查詢它。
5. LINQ to DataSet:DataSet對象在.NET Framework的第一版中引入。這個LINQ的變體允許使用LINQ輕松地查詢舊.NET數據。
6. LINQ to SQL:這是用于.NET 3.5的備用LINQ接口,主要用于Microsoft SQL Server,在.NET 4中被LINQ to Entities替代。
7. PLINQ:PLINQ或Parallel LINQ用并行編程庫擴展了LINQ to Objects,它可以使查詢同時在多核處理器上執行。
二. 給數據庫使用LINQ
1. 關系數據庫使用SQL數據庫語言(SQL表示Structured Query Language,結構化查詢語言)查詢和操作數據。
2. Visual Studio 2010和ADO.NET Entity Framework會把LINQ查詢自動轉換為SQL語句,使程序能很容易地處理C#對象。
3. 創建代碼,建立一系列匹配已有關系表結構的類和集合是很費時費力的,
但使用LINQ to SQL對象關系映射功能,可以從數據庫中自動創建匹配數據庫表的類,這樣就不必自己創建它,而可以直接開始使用類。
三. 安裝SQL Server和Northwind示例數據
1. 安裝SQL Server 2014
注意安裝過程中有一個填寫名稱的,Server name,默認是SQLEXPRESS
2. 安裝SQL 2000 Sample Databases
點擊運行.msi文件即可
四. 第一個LINQ數據庫查詢
1. 在VS里新建一個控制臺程序FirstLINQtoDatabaseQuery
2. 運行SQL Server 2014,記住這時候的Server name是ACER-PC/SQLEXPRESS,點“連接”
右鍵Databases,選擇Attach,Add,選擇到之前安裝好的SQL Server 2000 Sample Databases中的 northwnd.mdf,“OK”
注意:如果此時出現“Error:950”,可以用SQL Server打開northwnd.sql文件,運行,此時提示的錯誤給出文件的正確所在地方
把正確的文件.ldf和.mdf兩個文件拷貝到需要的文件夾里,然后再次Add即可
3. 右擊project,選擇Add New Item
4. 選擇ADO.NET Entity Data Model,名字可命名為Model1,點擊“Add”
5. 選擇第一個EF Designer from data

6. 選擇NorthwindConnectionString(Settings),點擊“Next”
注意:如果此時沒有這個選項,可選擇右邊的New Connection
在Server name中選擇或輸入之前的名稱ACER-PC/SQLEXPRESS
在Select or enter a database name中選擇Northwind

7. 選擇Tables,Finish,即可看到.edmx

注意:從第3步開始,如果按照教材上的步驟操作,如下,但是出來的結果不是需要的
3. 在VS中的Project中選擇Add New Data Source,選擇Database,選擇Dataset
4. 選擇NorthwindConnectionString(Settings),點擊“Next”
5. 選擇Tables,Finish,即可看到結果,但是是.xsd格式,不是.edmx

8. 打開主源文件Program.cs,并在Main()方法中添加如下代碼
static void Main(string[] args) { NORTHWNDEntities northWindEntities = new NORTHWNDEntities(); // 創建NORTHWNDEntities的一個實例var queryResults = from c in northWindEntities.Customers where c.Country == "USA" // where子句把結果限制為來自美國的顧客select new { ID=c.CustomerID, Name=c.CompanyName, City=c.City, State=c.Region // 由于該結果是來自美國的顧客,所以可以把Region重命名為State,以便更準確地顯示結果}; // select子句是一個投影,創建了一個新對象,其成員有ID、Name、City和Stateforeach (var item in queryResults) { Console.WriteLine(item); }; Console.WriteLine("Press Enter/Return to continue.."); Console.ReadLine(); }
9. 運行即可
{ ID = GREAL, Name = Great Lakes Food Market, City = Eugene, State = OR } { ID = HUNGC, Name = Hungry Coyote Import Store, City = Elgin, State = OR } { ID = LAZYK, Name = Lazy K Kountry Store, City = Walla Walla, State = WA } { ID = LETSS, Name = Let’s Stop N Shop, City = San Francisco, State = CA } { ID = LONEP, Name = Lonesome Pine Restaurant, Ci.ty = Portland, State = OR } { ID = OLDWO, Name = Old World Delicatessen, City = Anchorage, State = AK } { ID = RATTC, Name = Rattlesnake Canyon Grocery, City = Albuquerque, State = NM } { ID = SAVEA, Name = Save-a-lot Markets, City = Boise, State = ID } { ID = SPLIR, Name = Split Rail Beer & Ale, City = Lander, State = WY } { ID = THEBI, Name = The Big Cheese, City = Portland, State = OR } { ID = THECR, Name = The Cracker Box, City = Butte, State = MT } { ID = TRAIH, Name = Trail’s Head Gourmet Provisioners, City = Kirkland, State = WA } { ID = WHITC, Name = White Clover Markets, City = Seattle, State = WA } Press Enter/Return to continue...
至此,我們創建了一個基本的LINQ to SQL查詢,可以將它為基礎,來創建更復雜的查詢。
五. 瀏覽數據庫關系
1. ADO.NET Entity Framework是強大的一個方面是可以自動創建LINQ to SQL對象,以便瀏覽數據庫中相關表之間的關系
2. 示例:要給LINQ to Entities類添加一個相關表,再添加代碼,以瀏覽數據庫中的相關數據對象,并輸出它們的值
A. 上面的示例中,在main方法中的select子句中添加orders字段,注意c.Region后面的逗號
static void Main(string[] args) { NORTHWNDEntities northWindEntities = new NORTHWNDEntities(); var queryResults = from c in northWindEntities.Customers where c.Country == "USA" select new { ID = c.CustomerID, Name = c.CompanyName, City = c.City, State = c.Region, Orders = c.Orders // Orders是一種特殊的類型化LINQ集(System.Data.Linq.EntitySet<Order>),表示關系數據庫中兩個表之間的關系};
B. 修改foreach子句
foreach (var item in queryResults) { Console.WriteLine( "Customer: {0} {1}, {2}/n{3} orders:/tOrder ID/tOrder Date", // 格式化字符串
// 為每個顧客在第一行設置了姓名、城市和州等占位符,接著在下一行為該顧客的訂單輸出一個列標題item.Name, item.City, item.State, item.Orders.Count // 用方法Count()輸出顧客的訂單數); foreach (Order o in item.Orders) { Console.WriteLine("/t/t{0}/t{1}", o.OrderID, o.OrderDate); }
// 在嵌套的foreach語句中為每一行輸出訂單ID和訂單日期}; Console.WriteLine("Press Enter/Return to continue.."); Console.ReadLine(); }
// 建立一個嵌套的foreach語句,迭代每個顧客以及每個顧客的訂單
C. 運行即可
這是輸出的最后一部分,第一部分已滾動出了控制臺窗口的頂部
Customer: Trail’s Head Gourmet Provisioners Kirkland, WA 3 orders: Order ID Order Date 10574 6/19/1997 12:00:00 AM 10577 6/23/1997 12:00:00 AM 10822 1/8/1998 12:00:00 AM Customer: White Clover Markets Seattle, WA 14 orders: Order ID Order Date 10269 7/31/1996 12:00:00 AM 10344 11/1/1996 12:00:00 AM 10469 3/10/1997 12:00:00 AM 10483 3/24/1997 12:00:00 AM 10504 4/11/1997 12:00:00 AM 10596 7/11/1997 12:00:00 AM 10693 10/6/1997 12:00:00 AM 10696 10/8/1997 12:00:00 AM 10723 10/30/1997 12:00:00 AM 10740 11/13/1997 12:00:00 AM 10861 1/30/1998 12:00:00 AM 10904 2/24/1998 12:00:00 AM 11032 4/17/1998 12:00:00 AM 11066 5/1/1998 12:00:00 AM Press Enter/Return to continue...
新聞熱點
疑難解答