反射使用通用的查询+表达式数实现条件
电脑版发表于:2020/1/11 11:04
人生的曼妙就在于不可知会的际遇 愿你所去之地皆为热土 将遇之人皆为挚友
我希望有个如你一般的人
我希望有个如你一般的人,如山间清爽的风,如古城温暖的光,从清晨到夜晚,从山野到书房,只要最后是你,就好,我爱你(?′?‵?)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 类型的,如图:
这样,我们就直接调试该方法,就能拿到“特殊服务”条件的数据了。
最后我们可以运行递归的树形图,就可以得到该条件下的层次数据啦,这里就不做演示了。