tnblog
首页
视频
资源
登录

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

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


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

我希望有个如你一般的人

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


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

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

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


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



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

  1. public static List<Department> departmentList(string sql)
  2.         {
  3.             using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=123456;database=mydb"))
  4.             {
  5.                 conn.Open();
  6.                 using (SqlCommand com = new SqlCommand(sql,conn))
  7.                 {
  8.                     SqlDataReader reader = com.ExecuteReader();
  9.                     List<Department> departments = new List<Department>();
  10.                     while (reader.Read())
  11.                     {
  12.                         Department department = new Department();
  13.                         department.Id = reader["Id"].ToString();
  14.                         department.DepartmentName = reader["DepartmentName"].ToString();
  15.                         departments.Add(department);
  16.                     }
  17.                     return departments;
  18.                 }
  19.             }
  20.         }


控制层调用该方法即可


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

  1.  //通过查询获取数据,反射赋值1
  2.         public static List<T> ToList<T>(string sql)
  3.         {
  4.             using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=123456;database=mydb"))
  5.             {
  6.                 conn.Open();
  7.                 using (SqlCommand com = new SqlCommand(sql, conn))
  8.                 {
  9.                     SqlDataReader reader = com.ExecuteReader();
  10.                     List<T> departments = new List<T>();
  11.                     while (reader.Read())
  12.                     {
  13.                         //一个类通过反射实例化
  14.                         T obj = Activator.CreateInstance<T>();
  15.                         //遍历类型 所有的公开属性
  16.                         foreach (var item in obj.GetType().GetProperties())
  17.                         {
  18.                             string pname = item.Name;
  19.                             //取出对应属性名查询的value
  20.                             Object value = reader[pname];
  21.                             if (value != DBNull.Value)
  22.                             {
  23.                                 //反射赋值
  24.                                 item.SetValue(obj, value);
  25.                             }                          
  26.                         }
  27.                         departments.Add(obj);
  28.                     }
  29.                     return departments;
  30.                 }
  31.             }
  32.         }


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


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

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

  1. //获取数据,反射赋值2
  2.         public static List<T> ToList2<T>()
  3.         {
  4.             string tableName = typeof(T).Name;
  5.             string sql = "select * from " + tableName;
  6.             using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=123456;database=mydb"))
  7.             {
  8.                 conn.Open();
  9.                 using (SqlCommand com = new SqlCommand(sql, conn))
  10.                 {
  11.                     SqlDataReader reader = com.ExecuteReader();
  12.                     List<T> departments = new List<T>();
  13.                     while (reader.Read())
  14.                     {
  15.                         //一个类通过反射实例化
  16.                         T obj = Activator.CreateInstance<T>();
  17.                         //遍历类型 所有的公开属性
  18.                         foreach (var item in obj.GetType().GetProperties())
  19.                         {
  20.                             string pname = item.Name;
  21.                             //取出对应属性名查询的value
  22.                             Object value = reader[pname];
  23.                             if (value != DBNull.Value)
  24.                             {
  25.                                 //反射赋值
  26.                                 item.SetValue(obj, value);
  27.                             }
  28.                         }
  29.                         departments.Add(obj);
  30.                     }
  31.                     return departments;
  32.                 }
  33.             }
  34.         }


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


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

  1.  //获取数据,委托+反射赋值3
  2.         public static List<T> ToList3<T>(Expression<Func<T, bool>> predicate)
  3.         {
  4.             string tableName = typeof(T).Name;
  5.             string sql = "select * from " + tableName + " where ";
  6.             //例子:a.DepartmentName == "特殊服务"
  7.             BinaryExpression binaryExpression = predicate.Body as BinaryExpression;
  8.             //解析左边(提出名字)
  9.             MemberExpression memberExpression = binaryExpression.Left as MemberExpression;
  10.             string name = memberExpression.Member.Name;
  11.             sql += " " + name;
  12.             if (binaryExpression.NodeType == ExpressionType.Equal)
  13.             {
  14.                 sql += " = ";
  15.             }
  16.             //解析右边(提出名字)
  17.             //MemberExpression RightmemberExpression = binaryExpression.Right as MemberExpression;
  18.             // string rightValue = RightmemberExpression.Member.Name;
  19.             string rightValue = binaryExpression.Right.ToString().Replace("\"","");
  20.             sql += "'"+ rightValue + "'";
  21.             using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=123456;database=mydb"))
  22.             {
  23.                 conn.Open();
  24.                 using (SqlCommand com = new SqlCommand(sql, conn))
  25.                 {
  26.                     SqlDataReader reader = com.ExecuteReader();
  27.                     List<T> departments = new List<T>();
  28.                     while (reader.Read())
  29.                     {
  30.                         //一个类通过反射实例化
  31.                         T obj = Activator.CreateInstance<T>();
  32.                         //遍历类型 所有的公开属性
  33.                         foreach (var item in obj.GetType().GetProperties())
  34.                         {
  35.                             string pname = item.Name;
  36.                             //取出对应属性名查询的value
  37.                             Object value = reader[pname];
  38.                             if (value != DBNull.Value)
  39.                             {
  40.                                 //反射赋值
  41.                                 item.SetValue(obj, value);
  42.                             }
  43.                         }
  44.                         departments.Add(obj);
  45.                     }
  46.                     return departments;
  47.                 }
  48.             }
  49.         }


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

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


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

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

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


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

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

评价
你之所以觉得时间一年比一年过得快,是因为时间对你一年比一年重要。
排名
13
文章
64
粉丝
20
评论
30
MUI框架页面间的传值指针
XingDy姐 : 不错哦
MUI框架页面间的传值指针
剑轩 : 接口的真实地址可以用xx/yy什么的代替哦,真实地址还是隐藏一下好
.NET EF 用户按钮权限
YOU : 可以,在写文章的时候,有需要写代码的地方,可以选择编辑器上的代...
.NET EF 用户按钮权限
剑轩 : 哈哈哈哈,你这个追女生的逻辑
EF三种模式解析
剑轩 : 好文采!
重要sql语句和linq,lamdba分组条件查询语句
剑轩 : 开头那句诗句写得很好哇!
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
大本钟下送快递——上面摆,下面寄。