【IT168专稿】我们继续前一篇的示例。
现在,我们要在项目中增加一个用于筛选的DropDownList。您可以在15至20分钟内完成这个内容。本部分的重点是DataContext类、用C# 3.0写LINQ和参数化LINQ查询。
我们开始。如图1,我们从工具箱托拽一个DropDownList到default.aspx。

因为是从中途入手,而且之前没有写一行代码,这里我们要增加几行C#代码通过LINQ查询向DropDownList提取数据。同样,如果您刚接触LINQ,我还是建议您访问ScottGu的博客。
图2是在Page_Load事件中用于向DropDownList提取数据的代码:

步骤1、2就表明在完成Page_Load事件。重要的内容从步骤3开始 。
CustomerDataContext context = new CustomerDataContext()什么是CustomerDataContext? 他原来是什么?诚然,这会令很多刚解决LINQ的人很困惑。因此,我们集中揭秘它。还记得在第一部分我们增加了一个如图3的LINQ to SQL文件——Customer.dbml。

当我们托拽Customer表到Customer.dbml时,ASP.NET为我们生成了一些代码,虽然第一部分我们忽略掉,但不能总是不关注。双击Customer.dbml,然后在VS IDE中打开的Customer.dbml中选择View Code观察具体细节,如图4:

该操作会在项目中增加一个Customer.cs文件,如图5和6:
图5:

图6:

请注意分部类型CustomerDataContext,他是LINQ王国的关键所在。如果您退回到图2步骤3,我们在那就引用到它。这就是我们到数据库的连接,因此托拽到Customer.dbml的表、存储过程、函数都会经由它。它对于写LINQ查询很重要,可以从MSDN中用“DataContent”类找到相关细节。通过intellisence我们可以浏览到如图7中DataContext可能关系到的内容:

关于DataContext到此结束。回到图2的步骤4,它是一个采用var的LINQ查询,隐式类型var是C# 3.0的新特性,您可以在LINQ的文档和示例中种随处发现var的使用。
var query = from ct in context.customers这个查询语法有悖于任何熟悉T-SQL人员的直观感觉——先FROM子句再是SELECT.我猜这是初入LINQ领域人员遇到的最大障碍。但这有缘由,我会把这个讨论流到以后某些时候。能编译通过就说明那个LINQ语法是对的。
select ct.customer_type;
我们从Customer表返回的是一组Cutomer类型集合,就像用T_SQL写“SELECT Customer_TYPE FROM Customer”一样。
从T-SQL语句您会发现我们是要返回所有Customer类型,不过有点瑕疵——会返回重复的记录。没错,我们实际需要的是“select distinct customer_type from customer”,这样问题就是怎么做到?我猜我们大部分人用T-SQL会比用LINQ语法快得多的写出来。因此,我也会这么建议,不过遗憾的是我不清楚是否会有把T-SQL转换为LINQ的工具,有的话别忘了知会我。
如图2步骤5,我们会用query.Distinct()获得该效果。并且如Mike Taulty在博客中提到的,ToList()会保证查询只执行一次。图2的步骤6完成LINQ查询和DropDownList的绑定。至此,如果您Build项目,它会变异并生效。12-15行硬编码的C#代码会输出如图8的结果:
图8:

好!我们马上就完成了。我们写了LINQ查询,而且生效。现在剩下要做的就是用DropDownList过滤GridView的输出结果。如图9,选择LinqDataSource,配置LinqDataSource1 的Smarttag选项:
图9:

选择Next按钮,如图10:
图10:

选择配置数据源的Where按钮,如图11:
图11:

我们想根据Customer_type字段从DropDownList筛选。这个值应该从控件传入,因此,从ControlID中选择DropDownList,它的默认值应该是“Normal”。选择Add按钮,如图12:
图12:
下一个屏幕如图13:选择Finish按钮结束该过程。

最后,同时也是最重要的是允许根据DropDownList的Auto PostBack,如图:14。 这是我总是忘记的事情。

现在Build项目并在您喜欢的浏览器中检查结果,大致结果如图15:
图15:

别忘了用Query Profiler检查过往的T-SQL。事实上,SQL Server的Query Profiler是帮助理解LINQ查询的重要工具。毕竟SQL Server是“橡胶轮胎行驶的路面”。
我们用了15行C#代码完成了一个有些用的LINQ项目。现在我们可以为GridView增加分页并检查下面的T-SQL。 此外,我刚从别处听说——“选择所有选项岂不更好”,我可以选择DropDownList的“All”然后看到所有类型的用户数据。为什么不呢?这就是开发软件的乐趣。您可以从Level3开始直至Level7,然后回归基础。我猜这个需求并不赖。因此,我会在该项目的下一个迭代中增加分页和这个“ALL”选项。第三篇会包括很多在第一部分忽略的内容。