一. 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...
新闻热点
疑难解答