走进Linq-Linq to Objects(下)实例篇
[2] 走进Linq-Linq to Objects(下)实例篇
[3] 走进Linq-Linq to Objects(下)实例篇
[4] 走进Linq-Linq to Objects(下)实例篇
[5] 走进Linq-Linq to Objects(下)实例篇
[6] 走进Linq-Linq to Objects(下)实例篇
系列文章导航:
不能不说的C#特性-迭代器(下),yield以及流的延迟计算
走进Linq-Linq to SQL How do I(1)
走进Linq-Linq to SQL How do I(2)
走进Linq-Linq to SQL How do I(3)
走进Linq-Linq to SQL源代码赏析 Table
走进Linq-Linq to SQL源代码赏析之Provider的初始化
走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq
现在假设博客园程序启动的时候将数据库所有数据读入到内存中(多么荒谬啊,呵呵,仅仅是个假设),填充到上面这些对象里,那我们在内存中就有了这些集合: IList users,IList posts,IList roles,我们现在使用Linq to Objects对这些集合进行各种操作
向查询表达式传入参数
现在有一个用户输入http://yuyijq.cnblogs.com,通过UrlRewrite,这个连接将转向到http://www.cnblogs.com/blog.aspx?u=yuyijq,那现在我们的程序要干些什么呢?首先根据yuyijq读取该博主的所有帖子。那就要从IList集合里查找出UserName为”yuyijq”的所有帖子,但是显示在博客首页上的时候并不需要帖子的内容,如果把帖子内容也读取的话太耗资源了,只需要博客的标题,然后我们将这个只有标题和摘要的对象的集合绑定到一个GridView上:
where post.UserName == "yuyijq"
select post.Title;
mainGridView.DataSource = dataSource;
mainGridView.DataBind();
一切就如此简单,我只需要告诉它我需要什么,而不需要告诉它如何去做(不需要使用foreach等遍历posts集合,然后判断其UserName是否相等)。
但是很明显,这个查询是硬编码的,我直接将”yuyijq”传递到查询中,拜延迟计算所赐,我们可以在查询表达式里使用变量了:
var dataSource = from post in posts
where post.UserName == userName
select post.Title;
mainGridView.DataSource = dataSource;
mainGridView.DataBind();
也许你看到上面的代码不会觉得有什么特别,如果我将代码稍微坐下修改:
var dataSource = from post in posts
where post.UserName == userName
select post.Title;
userName = "yuyijq";
mainGridView.DataSource = dataSource;
mainGridView.DataBind();
你觉得最终GridView上绑定的应该是yuyijq的帖子还是zhzkl的帖子?实际执行点经过下面的代码:/p>
where post.UserName == userName
select post.Title;
的时候这个查询表达式并没有被执行,dataSource里装的也不是最终的结果,你可以理解为dataSource里放的是一个表达式,直到mainGridView.DataBind()的时候这个表达式才会被计算,所以上面的代码最终造成的结果是GridView上绑定的是yuyijq的帖子。