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


欢迎加群交流技术