使用 LinqDataSource 和 ASP.NET 数据控件 [第二部分]
使用 LinqDataSource 和 ASP.NET 数据控件(如 GridView 和 DropDownList)的第二部分。
涵盖的主题 | |||
介绍、LINQ to SQL 类文件、LinqDataSource 和 .dbml 文件结构 | DataContext 类、在 C# 3.0 中编写 LINQ 以及参数化 LINQ 查询 | 使用 LinqDataSource 动态更改底层 T-SQL 以及 CRUD 操作的一部分 [更新和删除] | 使用 LinqDataSource.Insert() 进行插入以及通过 web.config 管理数据库连接 |
LinqDataSource 第一部分 | LinqDataSource 第二部分 | LinqDataSource 第三部分 | LinqDataSource 第四部分 |
使用 LinqDataSource 和 ASP.NET 数据控件 [第二部分]
这是本文的第二部分。 第一部分 可在此处查看。我们将继续使用我们在 第一部分 中启动的示例项目。[ 第三部分 可在此处查看]
现在,我们将向项目中添加一个 DropDownList,并将其用作过滤器。完成此任务大约需要 15/20 分钟。此部分涵盖的重要内容包括 DataContext 类、在 C# 3.0 中编写 LINQ 以及参数化 LINQ 查询。
让我们开始吧。从工具箱中,将一个 DropDownList 添加到 default.aspx 中,如图 1 所示。
图 1
我们将添加几行 C# 代码。请注意,我们已经完成了一半,还没有编写一行基础代码。我们将使用 LINQ 查询填充 DropDownList。再次强调,如果您是 LINQ 新手,我强烈建议您访问 ScottGu 的博客文章。
填充 DropDownList 的代码将添加到 Page_Load 事件中,如图 2 所示。
图 2
正如步骤 1 和 2 所示,这清楚地表明这是 default.aspx.cs 页面的 page_load 事件。这里真正需要注意的重点是从步骤 3 开始的。
CustomerDataContext context = new CustomerDataContext()
CustomerDataContext 是什么?如何确定其来源?老实说,这些是会让任何 LINQ 新手感到困惑的点。所以让我们专注于解决这个谜团。还记得在第一部分中,我们将一个 LINQ to SQL 文件 customer.dbml 添加到了我们的项目中,如图 3 所示。
图 3
我们将 customer 表拖放到 customer.dbml 中的那一刻,ASP.NET 就为我们生成了一些代码。虽然我们在第一部分中忽略了它,但我们现在不能再忽视它了。只需在解决方案资源管理器中双击 Customer.dbml。这将打开 VS IDE 中的 Customer.dbml 文件。如图 4 所示,选择“查看代码”以查找更多详细信息。
图 4
此操作会将一个 Customer.cs 文件添加到您的项目中,如图 5 所示,其外观将如图 6 所示。
图 5
图 6
注意 partial class CustomerDataContext。这个 partial class 是我们通往 LINQ 王国的钥匙。如果您回到图 2,步骤 3 - 那就是我们所指的。这是我们与数据库的连接。因此,任何被拖放到 .dbml 文件上的表、存储过程、函数都将通过这个 DataContext partial class 可用。这个 partial class 对于编写 LINQ 查询非常重要。有关 DataContext 类的更多详细信息,请参阅此 MSDN 解释。只需尝试使用 intellisense 来探索 DataContext 的可能性,如图 7 所示。
图 7
关于 DataContext 类,暂时就到这里。回到图 2,步骤 4 - 这是一个真正的 LINQ 查询,使用了隐式类型 var。隐式类型是 C# 3.0 的一项新功能。您会在 LINQ 文档和示例中到处看到这个 var。
var query = from ct in context.customers
select ct.customer_type;
对于熟悉 T-SQL 的任何人来说,这种查询语法相当反直觉。首先是 from 子句,然后是 select 语法。我想这将是任何进入 LINQ 领域的人最大的障碍。但这是有原因的。我将在以后讨论。只要知道上面的代码是可以工作的,可以编译,并且是有效的 LINQ 语法就足够了。
我们将得到的是 customer 表中所有 customer_type 的集合。这相当于用 T-SQL 说“select customer_type from customer”。
正如您从这个 T-SQL 中可以看到的,我们将获得所有的 customer_type,尽管是所有重复出现的。我们真正需要的是“select distinct customer_type from customer”——对吧?现在的问题是如何解决。我想我们大多数人都能很快写出 T-SQL,但在对应的 LINQ 语法上会遇到困难。所以我推荐这个 很棒的资源。[不幸的是,我不知道任何可以将 T-SQL 转换为 LINQ 的工具。如果您找到了,请告诉我]
正如图 2 中步骤 5 所解释的,我们将使用 query.Distinct() 来实现此结果。而 ToList() 将确保此查询仅运行一次,正如 Mike Taulty 的博客 中所解释的。
图 2 中的步骤 6 将此 LINQ 查询绑定到我们的 DropDownList。此时,如果您构建项目,它将成功编译并运行。编写这 12-15 行硬编码 C# 代码将产生图 8 中的结果。
图 8
万岁!我们几乎完成了。我们编写了 LINQ 查询,并且它起作用了。现在,唯一要做的就是使用这个 DropDownList 来过滤 GridView 结果集。如图 9 所示,通过点击 LinqDataSource1 的智能标签选项,选择 LinqDataSource - 配置数据源选项。
图 9
点击配置数据源屏幕上的“下一步”按钮,如图 10 所示。
图 10
点击配置数据源屏幕上的“WHERE”按钮,如图 11 所示。
图 11
我们想根据 customer_type 过滤最终结果,所以从列下拉列表中选择它。此值应来自控件 - 因此从 ControlID 下拉列表中选择 DropDownList。默认值应为“Normal”。点击“添加”按钮,然后点击“确定”按钮,如图 12 所示。
图 12
在下一个屏幕上,如图 13 所示,点击“完成”按钮以完成此过程。
图 13
最后一件,也是最重要的一件事是启用 dropdownlist 上的自动回发,如图 14 所示。这是我几乎总是忘记的事情。
图 14
现在构建项目并在您喜欢的浏览器中评估最终结果。我们应该看到如图 15 所示的输出。
图 15
不要忘记在查询分析器中评估通过管道传输的 T-SQL。事实上,SQL Server 查询分析器是理解 LINQ 查询的重要工具。毕竟,SQL Server 是“实干兴邦”的地方。
我们在不到 15 行 C# 代码中就得到了一个正常工作的 LINQ 项目,并且它做了一些有用的事情。现在我们可以为 GridView 添加分页并检查底层 T-SQL。还有一件事——我刚听到有人说——“拥有一个‘全部’选项会不会很好——我的意思是——我可以从 DropDownList 中选择‘全部’,然后看到所有类型的客户”。为什么不呢?这就是开发软件的乐趣——你可以从第三层开始构建,然后到第七层,然后是基础——我认为这个需求并不过分。所以我们将在我们项目的下一次迭代中,在本文的 第三部分 中添加分页和这个“全部”选项。本文的 第一部分 涵盖了更多基础知识,如果您错过了的话。
注意:请为本系列投票并提供您的反馈,以便将来能有所改进/符合您的期望。谢谢!