你的位置:首页 > ASP.net教程

[ASP.net教程].Net 自己写个简单的ORM (练手)


   ORM 大家都知道, .Net 是EF  还有一些其他的ORM  从JAVA 中移植过来的 有 , 大神自己写的也有 

   不管ORM 提供什么附加的 乱七八糟的功能  

   但是 最主要的 还是 关系映射 的事情。

   我自己一直在使用ORMDapper 这个很小的ORM  第一次看到这个ORM  是通过一个帖子中 有人搞了个常见ORM 效率排行榜 ,自己也试了试  然后就看上 ORMDapper 这个了

   这是把轻量级发挥到极致了! 只有一个 96KB 的 一个Class 文件。其中还有很多是空格和注释信息。 

   

    最近在学习研究JAVA   觉得JAVA 比.NET  有趣点。  也为了 以后 .NET 不行了  还能弄JAVA  

 

    直接上代码:

 

      

    private static string ConnectionString = "**";         /// <summary>    /// 更新数据  没有sql参数就直接执行     /// </summary>    /// <param name="sql"> 需要执行的 sql </param>    /// <param name="o">传递的实体类对象 要求该类中字段必须和 sql参数名称一致 不区分大小写 </param>    /// <returns></returns>    public static int UpdateModel(string sql, object o)    {      var s = sql.Split('@');      return Update(sql, s.Length == 1 ? null : GetSqlParameters(o, s));    }    /// <summary>    /// 查询数据    /// </summary>    /// <typeparam name="T">映射的实体类</typeparam>    /// <param name="sql">执行的SQL语句</param>    /// <param name="o">传递的实体类对象 要求该类中字段必须和 sql参数名称一致 不区分大小写 </param>    /// <returns></returns>    public static List<T> SeleteModel<T>(string sql, object o) where T : class, new()    {      var s = sql.Split('@');      return Select<T>(sql, s.Length == 1 ? null : GetSqlParameters(o, s));    }    /// <summary>    /// 动态创建SqlParameter 对象    /// </summary>    /// <param name="o">传递的实体类对象 要求该类中字段必须和 sql参数名称一致 不区分大小写 </param>    /// <param name="s">切割后的SQL 语句</param>    /// <returns></returns>    private static SqlParameter[] GetSqlParameters(object o, string[] s)    {      s = s.Select(c => c.Split(' ')[0].Trim()).ToArray();       Type t = o.GetType();      if (t == typeof(object))        throw new Exception("UpdateModel 传递的类型是OBJECT 类型");      // 反射 读取字段 验证是否是 SQL 中的参数      var tlist =        t.GetFields(BindingFlags.Public | BindingFlags.Instance)          .Where(c => c.GetValue(o) != null & s.FirstOrDefault(a => a.ToLower() == c.Name.ToLower()) != null)          .ToList();      // 判断得到的数据 是否和 需要的数据 数量一致      if (tlist.Count() != s.Count() - 1)        throw new Exception("传递的实体中有值参数 和 sql 中需要的 数量不相等");      SqlParameter[] sp = new SqlParameter[tlist.Count()];      for (int i = 0; i < s.Length - 1; i++)      {        sp[i] = new SqlParameter(s[i + 1].Trim(), tlist.FirstOrDefault(c => c.Name.ToLower() == s[i + 1].ToLower()).GetValue(o));      }      return sp;    }    private static List<T> SeleteModel<T>(SqlDataReader data) where T : class, new()    {      // 获取列 个数      int iFieldCount = data.FieldCount;      List<T> list = new List<T>();      while (data.Read())      {        T tType = new T();        for (int i = 0; i < iFieldCount; i++)        {          // 反射注入字段值          string dataName = data.GetName(i);          FieldInfo fie = tType.GetType().GetField(dataName);          if (fie == null)            continue;          fie.SetValue(tType, data[dataName]);        }        list.Add(tType);      }      return list;    }    private static List<T> Select<T>(string sql, SqlParameter[] sp) where T : class, new()    {      using (SqlConnection conn = new SqlConnection(ConnectionString))      {        using (SqlCommand com = new SqlCommand(sql, conn))        {          conn.Open();          if (sp != null)            com.Parameters.AddRange(sp);          return SeleteModel<T>(com.ExecuteReader());        }      }    }    private static int Update(string sql, SqlParameter[] sp)    {      using (SqlConnection conn = new SqlConnection(ConnectionString))      {        using (SqlCommand com = new SqlCommand(sql, conn))        {          conn.Open();          if (sp != null)             com.Parameters.AddRange(sp);           return com.ExecuteNonQuery();        }      }    }

   调用示例:

  

 public class TestCalss  {    public static void Main()    {      string sql = @"SELECT TOP 1000 [ID]              ,[ExpressID]             ,[OrderID]             ,[MailCode]              ,[Send

  

     只是提供一种自己做一个简单的 ORM 的方式  

     说实话,自己弄的在好,也不如 网上大家都在用的 ORM 框架

     可以在这个简单的ORM 上经行加工 拓展,  比如 支持存储过程  不限定数据库  SQL 语句 分类    等等  

     有兴趣的朋友可以自己做做 ,我就不弄了。