您的位置:知识库 » 数据库

走进Linq-Linq to SQL源代码赏析 Table的获取过程

作者: 横刀天笑  来源: 博客园  发布时间: 2008-09-24 12:01  阅读: 9078 次  推荐: 0   原文链接   [收藏]  

系列文章导航:

走进Linq--Linq横空出世篇

走进Linq-辉煌的背后

走进Linq-Linq大观园

不能不说的C#特性-对象集合初始化器

不能不说的C#特性-匿名类型与隐式类型局部变量

不能不说的C#特性-扩展方法

不能不说的C#特性-匿名方法和Lambda表达式

不能不说的C#特性-迭代器(上)及一些研究过程中的副产品

不能不说的C#特性-迭代器(下),yield以及流的延迟计算

走进Linq-Linq to Objects(上)基础篇

走进Linq-Linq to Objects(下)实例篇

走进Linq-Linq to SQL感性认识篇

走进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-How do I(4)拾遗补零篇第一节

走进Linq-Linq to SQL源代码赏析 Table的获取过程

走进Linq-Linq to SQL源代码赏析之Provider的初始化

走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq


上一篇我们看到了DataContext是如何初始化的,它需要一个连接对象,还需要一个MappingSource做映射的配置。

DataContext中我们打交道最多的也许就是GetTable<TEntity>()方法了,这个方法会获取一个Table<TEntity>对象,今天我们就来看看这个对象是如何获取的。

对于获取Table<TEntity>对象我们还要看看这个DataContext是不是强类型的,关于强类型的DataContext可以看我前面一篇文章,强类型的DataContext里包含有几个Table<TEntity>类型的属性,比如我们的库中有blogsposts等数据库表,那么你可能就会建立Table<Blog>Table<Post>类型的属性(参见前面一篇文章)。在上一章DataContext的初始化里讲到Init方法的最后一行是InitTables方法的调用。我们首先来看看InitTables方法的代码:

/// <summary>
/// 初始化数据库中有几个表
/// 从方法实现中意图来看,这个方法主要在定义了强类型的DataContext才有意义
/// 在强类型的DataContext里一般定义了Table<Post>之类的字段来表示数据库中有几个
/// 表,该方法调用DataContext的GetTable方法设置这些字段的值
/// </summary>
/// <param name="schema"></param>
private void InitTables(object schema)
{
     
//用反射遍历DataContext类(可能是它的子类)里所有的公有实例字段
      foreach (FieldInfo info in schema.GetType().GetFields(BindingFlags.Public |
                  BindingFlags.Instance))
     {
        
//字段类型
         Type fieldType = info.FieldType;
        
//该字段是否是泛型的,并且是Table<>类型的,而且该字段的值为null
        if ((fieldType.IsGenericType && (fieldType.GetGenericTypeDefinition() ==
            typeof
(Table<>))) && (((ITable)info.GetValue(schema)) == null))
         {
              
//获取Table<TEntity>中TEntity的具体类型
                Type type = fieldType.GetGenericArguments()[0];
              
//调用DataContext的GetTable方法得到一个ITable对象
                ITable table = this.GetTable(type);
              
//设置值
                info.SetValue(schema, table);
          }
        }
}

0
0

数据库热门文章

    数据库最新文章

      最新新闻

        热门新闻