走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq2010-11-22 博客园 横刀天笑LINQ,语言集成查询,就是把一些查询操作集成到语言中(貌似是废话),比 如查询关系,而且提供一种一致的操作方式,不管最终的数据存储在哪里 ?内存中,远程数据库还是一Xml格式文件存储,不仅仅如此,你还可以用你丰 富的想象力扩充自己的查询。Linq to SQL无疑把Linq的能量发挥的淋漓尽致, 我们就以Linq to SQL的体系结构来学习一下Linq的整体框架。在上两章 里面我们通过源代码探讨了关于DataContext的初始化和Table<TEntity> 对象的获取,以及Provider的初始化。今天我们来看看Linq to SQL执行的大至 流程假如我们写下这样的代码:
DataContext dbCtx = new DataContext("server=localhost;database=cnblogs;user id=sa;pwd=sa");
Table<Post> posts = dbCtx.GetTable<Post>();
foreach (Post p in posts)
{
Console.WriteLine(p.Title);
}
在幕后到底发生了什么呢?看到foreach代码大家肯定都 知道这个Table<Post>肯定实现了IEnumerable<Post>接口,这里的 foreach的代码和下面这个代码的效果是一样的,实际上最终也是转换成这样的 代码:
IEnumerator<Post> iterator = posts.GetEnumerator();
while (iterator.MoveNext())
{
Post p = iterator.Current;
Console.WriteLine(p.Title);
}
既然如此那我们就得看看Table<TEntity>的 GetEnumerator方法了:
public IEnumerator<TEntity> GetEnumerator()
{
return ((IEnumerable<TEntity>)this.context.Provider.Execute(Expression.Constant(this)).ReturnValue).GetEnumerator();
}
从这里可以看出它是通过调用IProvider的Execute方法。关于Execute更深层次的内容,在本篇中并不涉及,你只要知道它根据 Lambda表达式生成SQL语句,然后对数据库进行操作就OK了。