在向大家详细介绍LINQ to SQL查询之前,首先让大家了解下LINQ to SQL查询数据库中的数据,然后全面介绍LINQ to SQL查询。
LINQ to SQL查询数据库中的数据
1. 虽然数据连接已经被确定并建立,但事实上,在一个查询被执行之前,没有任何数据会被接收。这被称为 lazy(迟缓的)加载或者是 deferred evaluation.(延迟执行),它们在大部分场景中将提高效率。下面代码所包含的查询将寻找伦敦的客户:
- Sub Main()
- '使用标准的数据连接字符串
- Dim db As DataContext
- db = New DataContext("Data Source=."sqlexpress; Initial Catalog=Northwind")
- '获取一个用于进行强类型查询的 Table 对象
- Dim Customers As Table(Of Customer)
- Customers = db.GetTable(Of Customer)()
- '将包含具体 SQL 的,LINQ to SQL 生成的日志显示到控制台窗口
- '这仅仅用于调试或理解Linq to Sql是如何工作的
- db.Log = Console.Out
- '查询伦敦的客户
- Dim custs = From customer In Customers _
- Where customer.City = "London" _
- Select customer
- End Sub
这个LINQ to SQL查询将返回所有来自伦敦的定义于 Customers 表中的客户。它被定义为查询表达式语法,编译器将把它编译为清晰的方法调用语法。同时请注意到,custs 集合的类型并没有被定义,这是一个非常便利的 Visual Basic 9.0 特性,它将允许你依靠编译器推断集合数据类型。特别是当查询将返回一个复合的多属性类型时,这将是一个尤其有用的特性,编译器将自动推断实际的类型而不需要额外的定义操作。
2. 增加下列代码以执行并输出结果:
- Sub Main()
- '使用标准的数据连接字符串
- Dim db As DataContext
- db = New DataContext("Data Source=."sqlexpress; Initial Catalog=Northwind")
- '获取一个用于进行强类型查询的 Table 对象
- Dim Customers As Table(Of Customer)
- Customers = db.GetTable(Of Customer)()
- '将包含具体 SQL 的,LINQ to SQL 生成的日志显示到控制台窗口
- '这仅仅用于调试或理解Linq to Sql 是如何工作的
- db.Log = Console.Out
- 'Query for customers in London
- Dim custs = From customer In Customers _
- Where customer.City = "London" _
- Select customer
- For Each cust In custs
- Console.WriteLine("ID={0}, City={1}", cust.CustomerID, cust.City)
- Next
- Console.ReadLine()
- End Sub
这些LINQ to SQL查询将仅仅在代码需要获取实际数据时才被执行。在那一时刻,一条相应的 SQL 命令被执行并且建立了相应的对象。这个概念被称之为“延迟执行”,它使查询能够冷静地评估并仅当需要结果的情况下才执行 SQL 命令——当即执行将有大量的往返损耗与不必要的对象化开销。
3. 按下F5以调试整个解决方案
4. 按下 ENTER,退出该程序。
调用 Console.ReadLine 方法的目的是防止控制台窗口在执行完毕后立即消失。在以后的步骤中,这一步并不一定都需要。
你将会看到像这个窗口一样的控制台窗口:
屏幕上的第一个部分展示了 Linq 生成并发送 SQL 命令到数据库的全过程。紧接着,你可以看到我们的查询返回的数据。需要注意的是,从数据库中接收的行将被转换为“真正的” CLR 对象,这将在调试器中被证实。
【编辑推荐】