Linq to Sql: 集成数据库语言查询之二
步骤 5 – 创建你的对象模型
1. 打开 Data Connections树视图
2. 展开 Northwind文件夹
3. 展开 Tables文件夹
4. 在 solution explorer 中双击打开 Northwind.dbml 文件
5. 从 table 文件夹拖拽 Customers表到 Linq to SQL 设计器
6. 从 table 文件夹拖拽Orders表到 Linq to SQL 设计器
7. 从 table 文件夹拖拽 Employees表到 Linq to SQL 设计器
步骤 6 – 查询你的对象模型
1. 按下 F5以调试你的程序
正如你所看到的,设计器为你写下了所有的“plumbing”代码。你的主程序果然运行正常!
步骤 7 – 映射一个存储过程
我们已经学会怎样从表映射到对象,以及如何声明两个表之间的关联。现在我们正希望让您了解怎样映射一个数据库中的存储过程到我们的对象模型。
1. 打开 Data Connections 树视图
2. 展开 Northwind 文件夹
3. 展开 Stored Procedures文件夹
4. 在 solution explorer 中双击打开 Northwind.dbml 文件
5. 从 Stored Procedures文件夹拖拽Ten Most Expensive Products到设计器
6. 对您的程序中的 Main 方法作出下列修改,使用从设计器创建的对象模型。
Sub Main()
'如果我们在设计器中保存了连接字符串,那么将不再需要提供连接字符串。
Dim db As New NorthwindDataContext()
Dim q = From customer In db.Customers _
Where customer.Region = Nothing _
Select customer.ContactName
For Each cust In q
Console.WriteLine(cust)
Next
Console.ReadLine()
End Sub
7. 按下F5以调试这个程序
当你输入了这段代码,注意他是这么工作的,在 IDE 中, IntelliSense将会把你的映射后的存储过程 Ten_Most_Expensive_Products显示为一个强类型的 DataContext 中的一个设计器生成的方法。同样提示你的,还包括设计器生成的类型Ten_Most_Expensive_Product 包含两个强类型的属性,它们映射从存储过程返回的字段。注意,如果你复制并粘贴上面的代码:简单地输入“p.”来观察我们谈论的话题。
步骤 8 – 检索新的结果集
迄今为止我们已经运行了能够接受完整对象的查询。但是我们也可以只查询需要的属性,您也可能需要创建复合的查询。在 Traditional SQL 中,含有任意列的集合都可以作为结果集返回。在 Linq to Sql,您可以透过使用匿名类型完成这类任务。
1. 修改Main方法中的代码,用于创建一个仅仅接收 ContactName 属性的查询并显示:
Sub Main()
'如果我们在设计器中保存了连接字符串,那么将不再需要提供连接字符串。
Dim db As New NorthwindDataContext()
Dim q = From customer In db.Customers _
Where customer.Region = Nothing _
Select Company = customer.CompanyName, _
Contact = customer.ContactName
For Each cust In q
Console.WriteLine("{0}/{1}", cust.Contact, cust.Company)
Next
Console.ReadLine()
End Sub
2. 再次修改这些代码,用于创建一个新的包含我们想得到数据的对象,而后进行输出:
Sub Main()
'如果我们在设计器中保存了连接字符串,那么将不再需要提供连接字符串。
Dim db As New NorthwindDataContext()
Dim ids = From customer In db.Customers _
From emp In db.Employees _
Where customer.City = emp.City _
Select emp.EmployeeID _
Distinct
For Each id In ids
Console.WriteLine(id)
Next
Console.ReadLine()
End Sub
Sub Main()
'如果我们在设计器中保存了连接字符串,那么将不再需要提供连接字符串。
Dim db As New NorthwindDataContext()
Dim ids = From customer In db.Customers _
From emp In db.Employees _
Where customer.City = emp.City _
Select emp.EmployeeID _
Distinct
For Each id In ids
Console.WriteLine(id)
Next
Console.ReadLine()
End Sub
3. 按下F5以调试这个程序
请注意这个操作符运行时没有相应的类型名称。原因是编译器将基于选择列的名称与类型,创建一个新的匿名类型。您同样需要注意,匿名类型中的成员已经被重命名为Company 与 Contact。指定名称是可选的,默认行为将把它命名为与映射对象中的源字段名称一致。最后,当 For Each 语法执行时,一个新类型的实例引用与它的所有类型将可以被访问。
4. 更改这些文档,完成一项 Join 操作:
Sub Main()
'如果我们在设计器中保存了连接字符串,那么将不再需要提供连接字符串。
Dim db As New NorthwindDataContext()
Dim ids = From customer In db.Customers _
From emp In db.Employees _
Where customer.City = emp.City _
Select emp.EmployeeID _
Distinct
For Each id In ids
Console.WriteLine(id)
Next
Console.ReadLine()
End Sub
5. 按下F5以调试整个解决方案
上述示例阐明了当没有显式关联可以导航的情况下,一个 SQL 样式的 Join 同样可以被使用。它同样展示了可以仅选定单个特别的属性可以代替整个对象被发送到程序中。