手撸ORM浅谈ORM框架之Query篇

拈花ヽ惹草 提交于 2020-11-20 07:59:34

  姗姗来迟结尾

  最近琐事缠身本应该上周就更新的文章,硬生生的拖到今天。实在抱歉,实在抱歉,实在抱歉!!!近期也不断为自己的职业生涯思考,两条路选择:技术路线?还是管理路线?不仅对自己目前状态进行深刻思考,还计划后面一段时间学习阅读优秀开源项目源码。

  从前的少年

  在<手撸ORM浅谈ORM框架之Add篇>提过微软提供了 基本原生 SQL 查询 可使用 FromSqlRaw 扩展方法基于原始 SQL 查询开始 LINQ 查询, FromSqlRaw 只能在直接位于 DbSet<> 上的查询根上使用;Query基类方法封装时,传入 SELECT COLUMN NAME FROMTABLENAME WHERE id=@id, parameters 或 string.Format("SELECT COLUMN NAME FROM TABLENAME WHERE id=[0]",id) 就遇到了 "Input string was not in a correct format." ,尝试多种参数均以失败告终;被迫最后转战ADO.NET原汁原味实现泛型查询。

  ADO.NET食用 (NET程序员必备法器)

  ADO.NET通过ADO.NET DataSet接口提供,包括一些与提供者层进行交互的组件,五大对象分别是:

  Connection (连接数据库)

  Command (执行T-SQL语句)

  DataAdapter (用户填充DataSet,断开模式)

  DataReader (读取数据库,一种只读模式,只向前的)

  DataSet (数据集,好比电脑的内存)

  .NET本质连接数据库,就是ADO.NET连接数据库、读取、删除、修改数据。(ADO.NET详细使用就不在本文赘述,博客园有很多相关优秀的文章)

  吃老婆本

  BaseRepository-》GetCurrentTableName已经在《手撸ORM浅谈ORM框架之Add篇》BaseRepository里面的方法,不重复搬砖了。

  自食其力  郑州同济医院治疗女性不孕不育好在哪:https://yyk.fh21.com.cn/hospital_6369/tsyl/16697492.html

  封装SqlQuery方法的基础工作是我们需要什么的样的Sql SELECT查询语句,我们先来看看SELECT语句结构: SELECT COLUMN NAME FROM TABLENAME ,以单个简单实体查询的Sql SELECT语句实操;

  BaseRepository-》GetQuerySql;

  

复制代码

 

  1 ///

 

  2 /// get query sql

  3 ///

 

  4 ///

  5 private string GetQuerySql()

  6 {

  7 string tableName = GetCurrentTableName();

  8 PropertyInfo[] propertyInfos = typeof(T).GetProperties();

  9 StringBuilder stringBuilder = new StringBuilder();

  10 foreach (var item in propertyInfos)

  11 {

  12 stringBuilder.AppendFormat("{0},", item.Name);

  13 }

  14 return string.Format("SELECT {0} FROM {1} ", stringBuilder.Remove(stringBuilder.Length - 1, 1), tableName);

  15 }

  

复制代码

 

  ADO.NET xxxSql用来执行查询数据Sql;

  

复制代码

 

  1 ///

 

  2 /// query sql return datatable

  3 ///

 

  4 ///sql

  5 ///

  6 public DataTable ExecuteDataTable(string sql)

  7 {

  8 using (MySqlConnection connection = new MySqlConnection(connectionString))

  9 {

  10 DataTable dt = new DataTable();

  11 try

  12 {

  13 connection.Open();

  14 MySqlDataAdapter command = new MySqlDataAdapter(sql, connection);

  15 command.Fill(dt);

  16 }

  17 catch (SqlException ex)

  18 {

  19 throw new Exception(ex.Message);

  20 }

  21 return dt;

  22 }

  23 }

  

复制代码

 

  BaseRepository-》DataTableToT,DataTable转换当前实体需要的类型(泛型方法);  郑州看不孕不育的医院有哪些-郑州同济医院:https://yyk.fh21.com.cn/hospital_6369/tsyl/16697491.html

  

复制代码

 

  1 ///

 

  2 /// datatable to t

  3 ///

 

  4 ///dataTable

  5 /// return t

  6 private T DataTableToT(DataTable dataTable)

  7 {

  8 var propertyInfos = typeof(T).GetProperties();

  9 foreach (DataRow row in dataTable.Rows)

  10 {

  11 T t = new T();

  12 foreach (PropertyInfo p in propertyInfos)

  13 {

  14 //类型需要做转换bool char

  15 if (p.PropertyType.Name == nameof(Boolean))

  16 {

  17 p.SetValue(t, Convert.ToBoolean(row[p.Name]));

  18 }

  19 else

  20 {

  21 p.SetValue(t, row[p.Name] is DBNull ? null : row[p.Name]);

  22 }

  23 }

  24 return t;

  25 }

  26 return default(T);

  27 }

  

复制代码

 

  实操BaseRepository-》Get根据id获取实体,主键暂时使用bigint类型id;查询条件使用lambda条件可以增加查询的灵活性(推荐使用这种方法);

  

复制代码

 

  1 ///

 

  2 /// get entity

  3 ///

 

  4 ///id

  5 /// return entity

  6 public T Get(long id)

  7 {

  8 string sql = string.Format("{0} WHERE {1}={2} LIMIT 1", GetQuerySql(), nameof(id), id);

  9 return SqlQuery(sql);

  10 //string sql = string.Format("{0} WHERE {1}=@{1}", GetQuerySql(), id);

  11 //return SqlQuery(sql, new[] { new MySqlParameter(string.Format("@{0}",id), id) });

  12 }

  

复制代码

 

  尾声

  手撸ORM浅谈ORM框架系列项目简易版ORM并不建议直接放在项目中使用,仅推荐除学习ORM原理需求者。项目中并没有很好地满足常规业务需要,例如:实体导航属性、主子表先后顺序等复杂实体,增删查改均未实现;并且还有很多待优化的地方,例如:缓存的使用、Sql语句的查询优化等等。 郑州不孕不育研究院-专科专治疗效好:https://yyk.fh21.com.cn/hospital_6369/tsyl/16697023.html

  获奖感言Finish

  自从决定写手撸ORM浅谈ORM框架系列,每一篇都反复的检查和修改,内容尽量提炼通俗易懂,把自己理解的完整的表述出来实属不易。文章中或许还存在不足,词不达意的地方请阅读者多多包涵。注册博客快三年了,毕业转眼间也三年多了,自从2018年1月8号到北京工作已有1039天了,一个普普通的本科毕业未经过培训结构的洗礼,偶尔蹭蹭公开课,技术是一点一滴的积攒出来的,对有些定义的理解、表达可能有些词不达意,请阅读者多多包涵!

  注:learn-orm-net目前只是作为学习ORM框架原理的Demo,项目会做出一定的优化处理,但不能直接拿来在项目中使用,毕竟现在NET Framework、NET Core已经有很多优秀的ORM框架,NET下一次发布就是只有一个版本了,NET5已经发布了,我们没有必要重复造轮子,造轮子是因为没有现成的优秀的轮子可用。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!