tnblog
首页
视频
资源
登录

反射使用通用的查询+表达式数实现条件

4867人阅读 2020/1/11 11:04 总访问:378155 评论:0 收藏:1 手机
分类: .NET Core


人生的曼妙就在于不可知会的际遇 愿你所去之地皆为热土 将遇之人皆为挚友

我希望有个如你一般的人

我希望有个如你一般的人,如山间清爽的风,如古城温暖的光,从清晨到夜晚,从山野到书房,只要最后是你,就好,我爱你(?′?‵?)I L???????


今天我们说的是关于使用反射+表达式数,得到通用查询数据

同样的在上一篇递归解析树形的层次数据的文章下,我们接着其他操作。

http://www.tnblog.net/15985459135/article/details/3171


1,为了方便代码管理的清晰,我们可以新建一个文件夹,新建一个类操作



方法1:常规的连接数据库方法,获取数据,代码如下;

public static List<Department> departmentList(string sql)
        {
            using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=123456;database=mydb"))
            {
                conn.Open();
                using (SqlCommand com = new SqlCommand(sql,conn))
                {
                    SqlDataReader reader = com.ExecuteReader();
                    List<Department> departments = new List<Department>();
                    while (reader.Read())
                    {
                        Department department = new Department();
                        department.Id = reader["Id"].ToString();
                        department.DepartmentName = reader["DepartmentName"].ToString();
                        departments.Add(department);
                    }
                    return departments;
                }
            }
        }


控制层调用该方法即可


方法2:通过sql语句查询获取数据,反射赋值,代码如下;

 //通过查询获取数据,反射赋值1
        public static List<T> ToList<T>(string sql)
        {
            using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=123456;database=mydb"))
            {
                conn.Open();
                using (SqlCommand com = new SqlCommand(sql, conn))
                {
                    SqlDataReader reader = com.ExecuteReader();
                    List<T> departments = new List<T>();
                    while (reader.Read())
                    {
                        //一个类通过反射实例化
                        T obj = Activator.CreateInstance<T>();
                        //遍历类型 所有的公开属性
                        foreach (var item in obj.GetType().GetProperties())
                        {
                            string pname = item.Name;
                            //取出对应属性名查询的value
                            Object value = reader[pname];
                            if (value != DBNull.Value)
                            {
                                //反射赋值
                                item.SetValue(obj, value);
                            }                          
                        }
                        departments.Add(obj);
                    }
                    return departments;
                }
            }
        }


需要提醒一下的是,这里value的空类型为DBNull,如果你if判断里写value !=null.value的话会报一个错;


控制层调用该方法即可,如下图;

方法3:不需要传sql语句查询来获取数据,反射赋值,代码如下; 

//获取数据,反射赋值2
        public static List<T> ToList2<T>()
        {
            string tableName = typeof(T).Name;
            string sql = "select * from " + tableName;
            using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=123456;database=mydb"))
            {
                conn.Open();
                using (SqlCommand com = new SqlCommand(sql, conn))
                {
                    SqlDataReader reader = com.ExecuteReader();
                    List<T> departments = new List<T>();
                    while (reader.Read())
                    {
                        //一个类通过反射实例化
                        T obj = Activator.CreateInstance<T>();
                        //遍历类型 所有的公开属性
                        foreach (var item in obj.GetType().GetProperties())
                        {
                            string pname = item.Name;
                            //取出对应属性名查询的value
                            Object value = reader[pname];
                            if (value != DBNull.Value)
                            {
                                //反射赋值
                                item.SetValue(obj, value);
                            }
                        }
                        departments.Add(obj);
                    }
                    return departments;
                }
            }
        }


同样也是控制器调用该方法,如下图;


方法4:反射使用查询赋值,表达式数实现条件,代码如下; 

 //获取数据,委托+反射赋值3
        public static List<T> ToList3<T>(Expression<Func<T, bool>> predicate)
        {
            string tableName = typeof(T).Name;
            string sql = "select * from " + tableName + " where ";
            //例子:a.DepartmentName == "特殊服务"
            BinaryExpression binaryExpression = predicate.Body as BinaryExpression;
            //解析左边(提出名字)
            MemberExpression memberExpression = binaryExpression.Left as MemberExpression;
            string name = memberExpression.Member.Name;
            sql += " " + name;
            if (binaryExpression.NodeType == ExpressionType.Equal)
            {
                sql += " = ";
            }
            //解析右边(提出名字)
            //MemberExpression RightmemberExpression = binaryExpression.Right as MemberExpression;
            // string rightValue = RightmemberExpression.Member.Name;
            string rightValue = binaryExpression.Right.ToString().Replace("\"","");
            sql += "'"+ rightValue + "'";
            using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=123456;database=mydb"))
            {
                conn.Open();
                using (SqlCommand com = new SqlCommand(sql, conn))
                {
                    SqlDataReader reader = com.ExecuteReader();
                    List<T> departments = new List<T>();
                    while (reader.Read())
                    {
                        //一个类通过反射实例化
                        T obj = Activator.CreateInstance<T>();
                        //遍历类型 所有的公开属性
                        foreach (var item in obj.GetType().GetProperties())
                        {
                            string pname = item.Name;
                            //取出对应属性名查询的value
                            Object value = reader[pname];
                            if (value != DBNull.Value)
                            {
                                //反射赋值
                                item.SetValue(obj, value);
                            }
                        }
                        departments.Add(obj);
                    }
                    return departments;
                }
            }
        }


同样也是控制器调用该方法,如下图;

我们调用此方法是根据条件查询的数据。


注释:我们lamdba 表达式的条件:a.DepartmentName == "特殊服务",用委托的表达式数解析。

当我们在解析右边数据的时候,这里虽然解析可以得到数据,但是它拼接了多余的符号,如图:

并且它是转换为ToString(),所以直接定义为string 类型的,如图:


这样,我们就直接调试该方法,就能拿到“特殊服务”条件的数据了。

最后我们可以运行递归的树形图,就可以得到该条件下的层次数据啦,这里就不做演示了。

评价
你之所以觉得时间一年比一年过得快,是因为时间对你一年比一年重要。
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术