【机房合作】新知识尝试

在这次机房合作中,学到了很多新的知识。因为我负责的D层,所以就来写一下在D层方面的尝试。

  • Datatable转List
  • 机房重构的时候,用的都是Datatable,机房合作的时候,小伙伴想要List的返回值,但是要一个List返回值,就转一下,代码量很多,而且一点儿也不简洁,所以就写了一个公共类。

     public class ConvertHelper<T> where T:new ()
        {
            public static List<T> ConvertToList(DataTable table)
            {
                //定义集合
                List<T> list = new List<T>();
                //获得T模型的类型
                Type type = typeof(T);
                string tempName = "";
    
                foreach (DataRow row in table.Rows)
                {
                    T t = new T();
                    //获得此模型的公共属性
                    PropertyInfo[] propertys = t.GetType().GetProperties();
                    //遍历该对象的所有公共属性
                    foreach (PropertyInfo pi in propertys)
                    {
                        //将属性名称赋值给临时变量
                        tempName = pi.Name;
                        //检查DataTable是否包含此列(列名==对象的属性名)
                        if (table.Columns.Contains(tempName))
                        {
                            //判断此属性是否有Setter
                            if (!pi.CanWrite) continue;//该属性不可写,直接跳出
                            //取值
                            object value = row[tempName];
                            //如果非空,则赋给对象的属性
                            if (value != DBNull.Value)
                                pi.SetValue(t, value, null);
                        }
                    }
                    //对象添加到泛型集合中
                    list.Add(t);
                }
                return list;
            }
        }
    

    需要将Datatable转为List返回值时,在D层只需要两行代码即可:

    //调用ConvertToList公共方法,来实现datatable转list
    List<LineInfo> list = ConvertHelper<LineInfo>.ConvertToList(table);
    return list;
    

    大大减少了代码量,完美~

  • 字典拼接
  • 我们实现代码,一天半的时间都不到。我觉得很大一部分原因在于,尝试使用了字典拼接。
    字典(Dictionary)里面的每一个元素都是一个键值对(由二个元素组成:键和值) ,在字典中,键必须是唯一的,而值不需要唯一的。其中键和值都可以是任何类型(比如:string, int, 自定义类型,等等)
    我们使用字典的原因就是,有时候很多SQL查询语句大部分都是一样的,只不过有的是实现查询卡号,有的是实现查询姓名,有的是实现查询性别,有的是没有什么限制条件。如果我需要查询卡号,SQL语句就能去查询卡号,我需要查询性别,SQL语句就能去查询性别,而且一条语句就能完成,字典拼接
    以查询消费者记录为例,其中返回值为List,参数为字典:

    public List<CustomerInfo> SelectAllCustomer(Dictionary<string, string> dic)
            {
                //查询所有的消费者
                string sql = "select * from T_Customer where 1=1,IsDelete=0";
                //查询语句实现字典拼接,查询内容由传过来的键值决定
                List<SqlParameter> listP = new List<SqlParameter>();
                //如果字典中有内容,则走该循环,否则直接执行SQL语句,查询所有的消费者
                if (dic.Count>0)
                {
                    foreach (var pair in dic)
                    {
                       //SQL语句进行字典拼接,实现多条件查询
                        sql += " and CustomerInfo." + pair.Key + "=@" + pair.Key;
                        listP.Add(new SqlParameter("@" + pair.Key, pair.Value));
                    }
                }
                DataTable table = helper.ExecuteQuery(sql, listP.ToArray(), CommandType.Text);
    
                //调用ConvertToList公共方法,来实现datatable转list
                List<CustomerInfo> list = ConvertHelper<CustomerInfo>.ConvertToList(table);
                return list;
            }
    

    希望能够给你一些帮助~
    感谢您的阅读~

    posted @ 2018-08-26 19:39  Developer_lulu  阅读(84)  评论(0编辑  收藏  举报