您要打印的文件是:用VB语言,在Web开发中使用LINQ

用VB语言,在Web开发中使用LINQ

作者:佚名    转贴自:http://tech.it168.com/d/2008-01-22/200801221752469.shtml    点击数:65


 如今的网络有很多伟大的创新,能够很容易利用LINQ的查询能力,并使之与Web用户界面的丰富新和灵活性相结合.的确很容易.

  在开始之前你需要弄明白几个概念:

  * LinqDataSource 控件 -- 允许你在基于Web的数据绑定中使用LINQ查询作为数据源. 
  * LinqDataSource.Selecting 事件 -- 允许你自定义任意LINQ定义查询(包括匿名查询) 为数据源. 只要从VB编辑器的下拉列表中选中LinqDataSource并选择Selecting事件, 然后在事件处理代码中设定e.Result = <你的LINQ查询> 即可.
  * OR设计器和Linq 到SQL -- 如果你正用LINQ查询直接连接到SQL数据库 (而不是对象集合, xml, 等等) 上, 这是一种创建查询的简单方法, 我们称它为DataContext 对象. “OR”是对象-关系映射的缩写, 例如, 从关系数据库数据到.NET对象的映射
  * ASP.NET 数据绑定表达式 -- 使你能够计算由数据源字段, 或简单控件的属性, 或控件列表而来的ASP形式的<%# Eval(YOURFIELD) %>表达式

  用LINQ到SQL创建一个简单的Web窗体

  第一篇文章用一个最简单的Web窗体, 来逐一解释这些概念. 然后我将根据你们的回复在以后的文章中添加更多主题并扩展这个示例.

  下面是一个最初我们需要的Web窗体输出示例 -- 一个非常简单的人力资源程序的员工列表单 -- 我得承认它缺少修饰, 并需要一些用户界面上的加工:
EmployeeID: 2 Andrew Fuller Andrew received his BTS commercial in 1974 and a Ph.D. in international marketing from the University of Dallas in 1981. He is fluent in French and Italian and reads German. He joined the company as a sales representative, was promoted to sales manager in January 1992 and to vice president of sales in March 1993. Andrew is a member of the Sales Management Roundtable, the Seattle Chamber of Commerce, and the Pacific Rim Importers Association. EmployeeID: 1 Nancy Davolio Education includes a BA in psychology from Colorado State University in 1970. She also completed The Art of the Cold Call. Nancy is a member of Toastmasters International.

  如果你对Visual Studio非常熟悉, 我估计你只要10到15分钟就能在你自己的机器上实现.
  准备

  - 确保已经安装Visual Studio 2008 或 Visual Web Developer 2008 Express. Express 版本.
  - 确保安装了 SQL Server 2005 Express 并已启动. 它通常在安装VS 或VS Express的同时默认被安装. 你也可以从这里下载安装.
  - 如果在你的机器上没有Northwind.mdf, 可以从这篇文章的附件中下载.
  为网站添加数据

  首先我们要把数据库添加到我们的工程中, 并创建必要的类以使用LINQ中的数据库 (用Linq到SQL).注意, 你可以选择跳过此步骤并创建你自己的LINQ查询到其他数据库上.

  通过File -> New Web Site ... -> ASP.NET Web Site创建一个新的网站到本地目录 
   把Northwind数据库添加到网站的App_Data文件夹
  1. 从本文附件中下载 Northwind.mdf 文件并保存到本地硬盘
  2. 把这个文件拖放到解决方案管理器的App_Data文件夹中
src=UploadFiles/200812216479.jpg
  通过OR设计器为Northwind创建LINQ到 SQL的类. Linq 到 SQL 类会被保存在一个.dbml 文件中并可以在可视的OR设计器中打开.

  1. 在解决方案资源管理器中右键单击网站结点, 选择快捷菜单的Add New Item -> Linq To SQL Classes
  2. 把DataClasses.dbml 重命名为NorthwindDataClasses.dbml. (这样做很重要, 以便在代码和VS向导中找到这些类).
  3.src=UploadFiles/2008122164846.jpg
  4.当下图中的对话框出现时, 点击 Yes以添加这个文件到App_Code 文件夹中. 这样做很重要, 因为网站需要动态地编译设计器生成的代码..
  5.src=UploadFiles/2008122165012.jpg
  6.双击 NorthwindDataClasses.dbml 以便在OR设计器中打开它.


  添加 Employees表的对象到你的 Linq到SQL 类中

  1. 打开服务器管理器 (在Express里是数据库管理器)
  2. 展开Northwnd.MDF -> Tables -> Employees
  3. 从服务器管理器中拖放Employees 表结点到NorthwindDataClasses.dbml 设计区域中(注意: 你可以继续添加更多的表, 或者存储过程, 或在设计器中自定义它们的名称/属性).
  4. 点击Save All按钮或菜单保存所有文件
src=UploadFiles/2008122165146.jpg
  排列窗体界面和数据源控件

  我们已经把数据库添加到网站上并创建了必要的LINQ到SQL类, 现在应该添加一些用户界面元素并连接数据到界面上了. 我不会做任何太漂亮的东西 -- 只是重复地绑定一个DataList (你可以把它替换成GridView, FormView 或其他你喜欢的控件) 中的文本框.

  1. 双击 Default.aspx , 在设计器中打开这个页面
  2. 从工具箱的Data选项卡中拖放一个DataList到Default.aspx 的设计区域中(或者拖放到”Source”视图的当前DIV标记区域内)
  3. 从工具箱的Data选项卡中拖放一个LinqDataSource 控件到 Default.aspx 的设计区域中(或者拖放到”Source”视图的DataList正下方)

  连接 LinqDataSource 到底层数据(LINQ 到SQL - DataContext)

  我们需要把LinqDataSource 连接到底层的LINQ数据上. 在这种情况下数据由任何一个基于NorthwindDataClasses 对象 (一个LINQ到SQL 文件) 的DataContext 对象或查询提供. 然后DataList可以直接把LinqDataSource 作为数据源, 并使用经典的Eval(“”) 语句通过绑定的字段显示数据. 如果你使用Smart Tags (智能标记), 设计器会为你生成一系列的默认值. 那我们就试试默认情况, 然后在此基础上做些调整.

  1. 在设计器中选中 LinqDataSource 控件. 展开它的智能标签并点击Configure Data Source...
  2.src=UploadFiles/2008122165348.jpg
  3.此时一个向导对话框会弹出, 并默认把NorthwindDataClasses 作为源. (任何其他你添加的可供查询的源也会在这里显示). 点击Next.
  4.src=UploadFiles/2008122165439.jpg
  5.你可以选择任意列或字段. 本例中我选择*. 你甚至可以设置一个Where子句 -- 不过我认为在代码中作参数化的查询或其他类型的查询操作会更容易一些. 我过会儿会作个演示... 点击 Finish.
src=UploadFiles/2008122165530.jpg

  7. 你可以选择性地从LinqDataSource 的智能标签里启用Delete, Insert, 和Update. 提示: 如果你要建一个可读/写的web窗体, 这会非常有用.
src=UploadFiles/2008122165614.jpg
  下面是在”Source”视图中可以看到的LinqDataSource 的标记. 注意ContextTypeName=NorthwindDataClassesDataContext -- 这个值是我们在设计器中创建的类型名称 (代码生成器在末尾添加了一个DataContext -- 这名字真长!). TableName 设置为我们想要显示的表或属性 -- 本例中设为Employees. 你可以用这种方法绑定任何现有的DataContext 类型和类属性.

<asp:LinqDataSource ID=LinqDataSource1 runat=server ContextTypeName=NorthwindDataClassesDataContext TableName=Employees> asp:LinqDataSource>

  绑定界面控件到 LinqDataSource

  现在让我们把 DataList连接到 LinqDataSource. 有一个好消息是DataList只关心LINQ查询通过LinqDataSource返回的字段名称 -- 当你不断改进动态 LINQ查询的字段和行结果时会给你方便.

  1. 在设计器中选中DataList. 展开智能标签并选择Data Source = LinqDataSource1
  2. 自定义一下DataList的ItemTemplate
  3. 运行! (按F5 或在快捷菜单中点击 View in Browser)

  默认情况下向导会创建一系列绑定的文本标签. 你可以利用设计器在编辑模式下选取你想要的.提示: 这是我通常在”Source”视图中拖放html标记的地方. 在本例中, 我只简单地显示full name, notes, 还有一块显示员工相片的地方. 并把数据转化到一个有两列的表格中.

   如果你检查一下DataList的标记, 你会发现ItemTemplate包含一些绑定的文本标签. 从查询中绑定数据是一个非常简单的过程,你只需要在服务器控件字段中, 用经典的ASP样式和VB eval数据绑定语句, 输入<%# Eval(YOURFIELDNAME) %>. 这为显示你想要的数据及格式化它们提供了很大的灵活性. 下面是我自定义的:

<div> <asp:DataList ID=DataList1 runat=server DataKeyField=EmployeeID DataSourceID=LinqDataSource1> <HeaderTemplate> <table> HeaderTemplate> <ItemTemplate> <tr> <td> <img src=PLACEHOLDER.jpg class= style=border: 4px solid white alt='Photo Number XXX' /> <br /><br /> td> <td>

  EmployeeID:

<asp:Label ID=EmployeeIDLabel runat=server Text='

上面的步骤提供了一个零代码实现绑定Web窗体到LINQ数据的方法. 但是, 你可能会问你自己, LINQ和VB去哪了? 确实是这样,LinqDataSource 隐藏了所有的查询代码并限制了你在设计器中可以做到的事情. 这对一些简单的例子来说足够了, 但LINQ真正强大的地方是可以使用任何窗体查询和VB逻辑. 好消息是LinqDataSource 支持使用你自己的LINQ查询处理LinqDataSource.Selecting事件. 这是你明确告诉控件应该用哪个查询的地方. 这很简单, 看下面:

  1. 右键单击Default.aspx 并选择View Code ...以显示文件的后台代码 (Default.aspx.vb).
  2. 在代码编辑器左手边上方的下拉列表中选择LinqDataSource1 对象.
  3. 在代码编辑器右手边上方的下拉列表中选择Selecting 事件. 代码编辑器会自动定位到事件处理函数.
  4.src=UploadFiles/200812217049.jpg
  5.在事件处理中编写你自定义的LINQ查询, 并确认在事件处理结束之前设置了e.Result =
  在本例中我将查询Northwind数据库中的员工表 (Employees), 定义一个名为FullName (=First + Last)的自定义表达式 (Custom Expression) 列, 取以A或N开头的全名(FullName), 最后按姓氏排序. 注意我为每个属性都创建了别名, 所以现在query是一个匿名类型 -- 并且NorthwindDataContext 被默认地设置为所有列(*). 提示: 如果当你试着这样做时遇到运行时错误, 确认一下所有Web窗体需要的字段都存在. -- 例如: 如果窗体需要 EmployeeID, 确认一下你的查询中包括这个字段.

Protected Sub LinqDataSource1_Selecting(ByVal sender As Object, ByVal e _ As System.Web.UI.WebControls.LinqDataSourceSelectEventArgs) _ Handles LinqDataSource1.Selecting Dim northwind As New NorthwindDataClassesDataContext 'custom anonymous LINQ query Dim query = From emp In northwind.Employees _ Select emp.EmployeeID, emp.FirstName, emp.LastName, emp.Notes, _ FullName = emp.FirstName & & emp.LastName _ Where FirstName.ToUpper.StartsWith(A) Or FirstName.ToUpper.StartsWith(N) _ Order By FullName 'sets LinqDataSource query equal to custom query. 'use data binding expressions to look up aliased fields above. e.Result = query End Sub

  你可以再次运行这个程序, 看看自定义查询是否有效 -- 只返回两行-- Andrew Fuller 和 Nancy Davolio. 我们也可以调整一下标记代码以使用我们新定义表达式列 -- “FullName” . 下面是更改后DataList标记的样子:

<asp:DataList ID=DataList1 runat=server DataKeyField=EmployeeID DataSourceID=LinqDataSource1> <HeaderTemplate> <table> HeaderTemplate> <ItemTemplate> <tr> <td> <img src=PLACEHOLDER.jpg class= style=border: 4px solid white alt='Photo Number XXX' /> <br /><br /> td> <td>

  EmployeeID:

<asp:Label ID=EmployeeIDLabel runat=server Text='
总结和更多信息 要想了解全部, 一个简单的方法是把你所知道的有关Web 窗体的与你在VB中学到的Linq作比较. LinqDataSource 连接底层Linq到SQL 的DataContext或任何通用的Linq查询, 到你Web窗体的其余部分. 你可以在LinqDataSource.Selecting事件处理函数中创建完全自定义的查询, 并通过e.Result把它传递给控件. 然后你可以在你的Linq查询中使用经典的Eval(MYFIELD) 数据绑定表达式获取任何你想要的字段或属性.