章节列表:

一步步实现自己的ORM(一)

一步步实现自己的ORM(二)

通过前面两篇文章,我们大致了解了ORM的基本原理,是通过Attribute+反射获取表的基本信息,再用表名和字段名拼接成SQL语句。而前面我们只是完成了CRUD部分的CUD,还没完成读取(Retrieve)操作,今天就来完成这个R操作。我们先看下平时写实体类转换代码是怎么写的:

        static List<User> ToObject1()
        {
            SqlDataReader reader = null;
            List<User> list = new List<User>();
            while (reader.Read())
            {
                User user = new User();
                if (reader["UserId"] != null)
                    user.UserId = (int)reader["UserId"];

                if (reader["Email"] != null)
                    user.Email = (string)reader["Email"];

                if (reader["CreatedTime"] != null)
                    user.CreatedTime = (DateTime)reader["CreatedTime"];

                list.Add(user);
            }
            return list;
        }

经常写DataReader对象转换成实体类的童鞋们,WHILE循环里的内容是根据实体类的不同代码而有所不同,循环外的代码则是固定不变的,现在我们要把变化的代码抽离出来,我们还是请出明星--反射。

在前面章节我们都是用反射读取实体类里的,比如typeof(User).GetProperty("UserId").GetValue(obj,null),有GetValue肯定也有SetValue,我们看下SetValue的定义:

public virtual void SetValue(
    Object obj,
    Object value,
    Object[] index
)

obj:将设置其属性值的对象。

value:新的属性值。

index : 。 

示例代码:

            User user = new User();
            typeof(User).GetProperty("UserId").SetValue(user, 10, null);
            Console.WriteLine(user.UserId);

输出结果我就不贴图了,是“10”。

HOHO,我们开始构建代码,步骤如下:

  1. new 实体类对象

  2. 反射类的属性,然后用SetValue给实体类属性赋值

具体代码如下:

            string sql = "select * from tb_users";
            SqlConnection conn = new SqlConnection(EntityHelper.connectionString);
            conn.Open();

           var cmd =  conn.CreateCommand();
           cmd.CommandText = sql;

            SqlDataReader reader = cmd.ExecuteReader();
            List<User> list = new List<User>();
            var type = typeof(User);
            var properties = type.GetProperties();
            while (reader.Read())
            {
                User user = new User();
                for (int i = 0; i < properties.Length; i++)
                {
                    var pi = properties[i];
                    if (reader[pi.Name] != null) //等同于 if (reader["UserId"] != null)这样的语句
                        pi.SetValue(user, reader[pi.Name], null); //等同于 user.UserId = (int)reader["UserId"];
                }

                list.Add(user);
            }

            foreach (var item in list)
            {
                Console.WriteLine("UserId:{0},Email:{1},CreatedTime:{2}", item.UserId, item.Email, item.CreatedTime);
            }
View Code

相关文章: