.NET ORM框架(一)

最近做项目自己整理了一个ORM框架,分享给大家看看,有很多不足望大家指出。

下面是使用方法

BLL 主要方法

 public class TestBLL : ManagerBLL
    {
        public static TestBLL __instance = null;
        public static TestBLL GetInstance()
        {
            if (__instance == null) __instance = new TestBLL();
            return __instance;
        }

        public void test() 
        {
            Admin_User admin=new Admin_User();
            admin.User_Name="";
            admin.User_NikeName="";         
            //条件
            WhereClip<Admin_User> where = new WhereClip<Admin_User>(a => a.User_Name=="x" && a.User_ID == 1 || a.User_RegIP=="dd");
            where.And(a=>a.User_Status==1);
            where.Or(a=>a.User_TrueName=="");
            //模糊条件
            where.And(a=>a.User_Password.Like(String.Format("%{0}%",1)));
            //列名
            ColumnsClip<Admin_User> columnsClip=new ColumnsClip<Admin_User>(a=>a.Columns(a.User_ID,a.User_LastIP,a.User_LoginNumber));
            //排序
            OrderByClip<Admin_User> orderByClip=new OrderByClip<Admin_User>(a=>a.OrderBy(a.User_ID.Desc(),a.User_LastIP.Asc()));
            //查询第一行第一列
            base.GetCount(where);
            //查询一行
            base.Get(columnsClip, where, orderByClip);
            //查询成List
            base.GetList(0, columnsClip, where, orderByClip);
            //分页查询
            base.GetList(columnsClip, where, orderByClip, 10, 1, 0);
            //添加
            base.Add(admin);
            //批量添加-事物
            List<BaseEntity> list = new List<BaseEntity>();
            Admin_User admins = (Admin_User)admin.Clone();//深度复制
            list.Add(admin);
            list.Add(admins);
            base.AddList(list);
            //修改
            base.Edit(admin, where);
            //批量修改-事物
            Dictionary<BaseEntity, object> dic = new Dictionary<BaseEntity, object>();
            dic.Add(admin, where);
            dic.Add(admins, where);
            base.EditList(dic);
            //删除
            base.Remove(admin);
            //批量删除-事物
            base.RemoveList(dic);
        }
    }
子类继承父类, 直接用BASE调用 ManagerBLL 中的方法。


codesmith自动生成实体

 /// <summary>
    /// Modal class: Admin_User.
    /// </summary>
    [Serializable]
    [Table(Name = "Admin_User", PrimaryKey = "user_ID")]
    public class Admin_User : BaseEntity
    {
        #region Private Properties

        private int? user_ID;//ID
        private string user_Name;//用户名
        private string user_Password;//密码
        private string user_NikeName;//用户昵称
        private string user_TrueName;//用户真实姓名
        private string user_Email;//Email
        private string user_RegIP;//注册IP
        private DateTime? user_CreateTime;//注册时间
        private int? user_LoginNumber;//登录次数
        private DateTime? user_LastTime;//最后登录时间
        private string user_LastIP;//最后登录IP
        private int? user_Status;//状态

        #endregion

        #region Public Properties

        /// <summary>
        /// ID.
        /// </summary>
        [Column(Name = "user_ID", PrimaryKey = true, Strategy = GenerationType.INDENTITY)]
        public int? User_ID
        {
            get
            {
                return user_ID;
            }
            set
            {

                user_ID = value;
            }
        }

        /// <summary>
        /// 用户名.
        /// </summary>
        [Column(Name = "user_Name")]
        public string User_Name
        {
            get
            {
                return user_Name;
            }
            set
            {
                user_Name = value.SubStr(50);
            }
        }


        /// <summary>
        /// 密码.
        /// </summary>
        [Column(Name = "user_Password")]
        public string User_Password
        {
            get
            {
                return user_Password;
            }
            set
            {
                user_Password = value.SubStr(50);
            }
        }


        /// <summary>
        /// 用户昵称.
        /// </summary>
        [Column(Name = "user_NikeName")]
        public string User_NikeName
        {
            get
            {
                return user_NikeName;
            }
            set
            {
                user_NikeName = value.SubStr(50);
            }
        }


        /// <summary>
        /// 用户真实姓名.
        /// </summary>
        [Column(Name = "user_TrueName")]
        public string User_TrueName
        {
            get
            {
                return user_TrueName;
            }
            set
            {
                user_TrueName = value.SubStr(50);
            }
        }


        /// <summary>
        /// Email.
        /// </summary>
        [Column(Name = "user_Email")]
        public string User_Email
        {
            get
            {
                return user_Email;
            }
            set
            {
                user_Email = value.SubStr(50);
            }
        }


        /// <summary>
        /// 注册IP.
        /// </summary>
        [Column(Name = "user_RegIP")]
        public string User_RegIP
        {
            get
            {
                return user_RegIP;
            }
            set
            {
                user_RegIP = value.SubStr(50);
            }
        }


        /// <summary>
        /// 注册时间.
        /// </summary>
        [Column(Name = "user_CreateTime")]
        public DateTime? User_CreateTime
        {
            get
            {
                return user_CreateTime;
            }
            set
            {
                user_CreateTime = value;
            }
        }


        /// <summary>
        /// 登录次数.
        /// </summary>
        [Column(Name = "user_LoginNumber")]
        public int? User_LoginNumber
        {
            get
            {
                return user_LoginNumber;
            }
            set
            {
                user_LoginNumber = value;
            }
        }


        /// <summary>
        /// 最后登录时间.
        /// </summary>
        [Column(Name = "user_LastTime")]
        public DateTime? User_LastTime
        {
            get
            {
                return user_LastTime;
            }
            set
            {
                user_LastTime = value;
            }
        }


        /// <summary>
        /// 最后登录IP.
        /// </summary>
        [Column(Name = "user_LastIP")]
        public string User_LastIP
        {
            get
            {
                return user_LastIP;
            }
            set
            {
                user_LastIP = value.SubStr(50);
            }
        }


        /// <summary>
        /// 状态.
        /// </summary>
        [Column(Name = "user_Status")]
        public int? User_Status
        {
            get
            {
                return user_Status;
            }
            set
            {
                user_Status = value;
            }
        }



        #endregion


    }

codesmith 脚本写好既可以自动生成实体,非常方便快捷。


EntityManager 接口

public interface EntityManager
    {

        T Get<T>(WhereClip<T> whereClip) where T : BaseEntity, new();

        T Get<T>(ColumnsClip<T> columnsClip, WhereClip<T> whereClip, OrderByClip<T> orderByClip) where T : BaseEntity, new();

        List<T> GetList<T>(int top, ColumnsClip<T> columnsClip, WhereClip<T> whereClip, OrderByClip<T> orderByClip) where T : BaseEntity, new();

        int GetCount<T>(WhereClip<T> whereClip) where T : BaseEntity, new();

        //分页查询
        ConditionResult<T> GetList<T>(ColumnsClip<T> columnsClip, WhereClip<T> whereClip, OrderByClip<T> orderByClip, int nPageSize, int nPageIndex, int nTotalCount) where T : BaseEntity, new();

        //新增
        int Add<T>(T entity);

        //批量新增,采用事务
        bool AddList<T>(List<T> entityList);

        //修改
        int Edit<T>(T entity);

        //多条件修改
        int Edit<T>(T entity, WhereClip<T> whereClip) where T : BaseEntity, new();

        //批量修改,采用事物
        bool EditList<T>(Dictionary<T, object> dicList) where T : BaseEntity, new();

        //删除
        int Remove<T>(T entity);

        //根据ID删除数据
        int Remove<T>(WhereClip<T> whereClip) where T : BaseEntity, new();

        //批量删除,采用事物
        bool RemoveList<T>(Dictionary<T, object> dicList) where T : BaseEntity, new();
    }



ManagerBLL 核心

        /// <summary>
        /// 获取一行数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="whereClip"></param>
        /// <returns></returns>
        /// 
        public T Get<T>(WhereClip<T> whereClip) where T : BaseEntity, new()
        {
            //说明 性能问题还尚未考虑。
            T _T = new T();

            PropertyInfo[] properties = ReflectionUtils.GetProperties(_T.GetType());

            string whereString = string.Empty;

            if (whereClip != null)
                whereString = whereClip.WhereString;

            TableInfo tableInfo = DbEntityUtils.GetTableInfo(_T, DbOperateType.SELECT);

            string commandText = BuildSql.GetFristSql(0, tableInfo, whereString, string.Empty);

            IDataReader sdr = null;
            if (whereClip != null)
            {
                DbParameter[] parms = SqlOpera.MakeInParams(whereClip.Table);
                sdr = SqlOpera.ExecuteReader(CommandType.Text, commandText, parms);
            }
            else
                sdr = SqlOpera.ExecuteReader(CommandType.Text, commandText);

            while (sdr.Read())
            {
                foreach (PropertyInfo property in properties)
                {
                    //通过实体类属性名称获取Column自定义属性配置的映射列名
                    string name = tableInfo.PropToColumn[property.Name].ToString();


                    //通过获取的列名从dataReader中检索值,并赋给实体对象属性
                    ReflectionUtils.SetPropertyValue(_T, property, sdr[name]);
                }
                break;
            }
            sdr.Close();
            return _T;
        }

        /// <summary>
        /// 获取一行数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="columnsClip"></param>
        /// <param name="whereClip"></param>
        /// <param name="orderByClip"></param>
        /// <returns></returns>
        public T Get<T>(ColumnsClip<T> columnsClip, WhereClip<T> whereClip, OrderByClip<T> orderByClip) where T : BaseEntity, new()
        {
            //说明 性能问题还尚未考虑。
            T _T = new T();
            string orderByWhere = string.Empty;
            string columnsWhere = string.Empty;
            string whereString = string.Empty;
            PropertyInfo[] properties = ReflectionUtils.GetProperties(_T.GetType());

            if (orderByClip != null)
                orderByWhere = orderByClip.OrderByWhere;

            if (columnsClip != null)
                columnsWhere = columnsClip.ColumnsWhere;

            if (whereClip != null)
                whereString = whereClip.WhereString;


            TableInfo tableInfo = null;
            if (columnsClip == null)
                tableInfo = DbEntityUtils.GetTableInfo(_T, DbOperateType.SELECT);

            string tableName = DbEntityUtils.GetTableName(_T.GetType());//获取表名

            string commandText = null;

            if (columnsClip != null)
                commandText = BuildSql.GetFristSqlByWhere(tableName, columnsWhere, whereString, orderByWhere);
            else
                commandText = BuildSql.GetFristSql(0, tableInfo, whereString, orderByWhere);

            IDataReader sdr = null;
            if (whereClip != null)
            {
                DbParameter[] parms = SqlOpera.MakeInParams(whereClip.Table);
                sdr = SqlOpera.ExecuteReader(CommandType.Text, commandText, parms);
            }
            else
            {
                sdr = SqlOpera.ExecuteReader(CommandType.Text, commandText);
            }

            while (sdr.Read())
            {
                foreach (PropertyInfo property in properties)
                {
                    //通过实体类属性名称获取Column自定义属性配置的映射列名
                    string name = DbEntityUtils.GetColumnAttributeName(property);

                    //通过获取的列名从dataReader中检索值,并赋给实体对象属性
                    for (int i = 0; i < sdr.FieldCount; i++)
                    {
                        if (sdr.GetName(i) == name)
                        {
                            ReflectionUtils.SetPropertyValue(_T, property, sdr[name]);
                            break;
                        }
                    }
                }
                break;
            }
            sdr.Close();
            return _T;
        }

        /// <summary>
        /// 获取List集合
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="top"></param>
        /// <param name="columnsClip"></param>
        /// <param name="whereClip"></param>
        /// <param name="orderByClip"></param>
        /// <returns></returns>
        public List<T> GetList<T>(int top, ColumnsClip<T> columnsClip, WhereClip<T> whereClip, OrderByClip<T> orderByClip) where T : BaseEntity, new()
        {

            //说明 性能问题还尚未考虑。
            T _T = new T();
            List<T> listT = new List<T>();
            string orderByWhere = string.Empty;
            string columnsWhere = string.Empty;
            string whereString = string.Empty;
            PropertyInfo[] properties = ReflectionUtils.GetProperties(_T.GetType());

            if (orderByClip != null)
                orderByWhere = orderByClip.OrderByWhere;

            if (columnsClip != null)
                columnsWhere = columnsClip.ColumnsWhere;

            if (whereClip != null)
                whereString = whereClip.WhereString;

            string commandText = null;
            DataSet ds = null;

            if (columnsClip != null)
            {
                string tableName = DbEntityUtils.GetTableName(_T.GetType());//获取表名
                commandText = BuildSql.GetListSql(top, tableName, columnsWhere, whereString, orderByWhere);
            }
            else
            {
                TableInfo tableInfo = DbEntityUtils.GetTableInfo(_T, DbOperateType.SELECT);
                commandText = BuildSql.GetFristSql(top, tableInfo, whereString, orderByWhere);
            }

            if (whereClip != null)
            {
                DbParameter[] parms = SqlOpera.MakeInParams(whereClip.Table);
                ds = SqlOpera.ExecuteDataset(CommandType.Text, commandText, parms);
            }
            else
            {
                ds = SqlOpera.ExecuteDataset(CommandType.Text, commandText);
            }

            if (ds.Tables.Count == 0) return listT;
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                T entityT = new T();
                foreach (PropertyInfo property in properties)
                {
                    //通过实体类属性名称获取Column自定义属性配置的映射列名
                    string name = DbEntityUtils.GetColumnAttributeName(property);

                    //通过获取的列名从datatable中检索值,并赋给实体对象属性

                    if (dr.Table.Columns.Contains(name))
                        ReflectionUtils.SetPropertyValue(entityT, property, dr[name]);

                }
                listT.Add(entityT);
            }


            return listT;
        }

        /// <summary>
        /// 分页
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="columnsClip"></param>
        /// <param name="whereClip"></param>
        /// <param name="orderByClip"></param>
        /// <param name="nPageSize"></param>
        /// <param name="nPageIndex"></param>
        /// <param name="nTotalCount"></param>
        /// <returns></returns>
        public ConditionResult<T> GetList<T>(ColumnsClip<T> columnsClip, WhereClip<T> whereClip, OrderByClip<T> orderByClip, int nPageSize, int nPageIndex, int nTotalCount) where T : BaseEntity, new()
        {

            T _T = new T();
            List<T> listT = new List<T>();
            ConditionResult<T> conditionResult = new ConditionResult<T>();
            string orderByWhere = string.Empty;
            string columnsWhere = string.Empty;
            string whereString = string.Empty;
            int totalCount = 0;
            PropertyInfo[] properties = ReflectionUtils.GetProperties(_T.GetType());

            if (orderByClip != null)
                orderByWhere = orderByClip.OrderByWhere;

            if (columnsClip != null)
                columnsWhere = columnsClip.ColumnsWhere;

            if (whereClip != null)
                whereString = whereClip.WhereString;

            totalCount = GetCount(whereClip);

            string commandText = null;

            DataSet ds = null;

            TableInfo tableInfo = DbEntityUtils.GetTableInfo(_T, DbOperateType.SELECT);
            string tableName = DbEntityUtils.GetTableName(_T.GetType());//获取表名
            commandText = BuildSql.GetPageSql(tableName, columnsWhere, whereString, orderByWhere, nPageSize, nPageIndex, tableInfo);

            if (whereClip != null)
            {
                DbParameter[] parms = SqlOpera.MakeInParams(whereClip.Table);
                ds = SqlOpera.ExecuteDataset(CommandType.Text, commandText, parms);
            }
            else
            {
                ds = SqlOpera.ExecuteDataset(CommandType.Text, commandText);
            }

            if (ds.Tables.Count == 0) return conditionResult;

            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                T entityT = new T();
                foreach (PropertyInfo property in properties)
                {
                    //通过实体类属性名称获取Column自定义属性配置的映射列名
                    string name = DbEntityUtils.GetColumnAttributeName(property);

                    //通过获取的列名从datatable中检索值,并赋给实体对象属性

                    if (dr.Table.Columns.Contains(name))
                        ReflectionUtils.SetPropertyValue(entityT, property, dr[name]);

                }
                listT.Add(entityT);
            }

            conditionResult.ResultList = listT;
            conditionResult.PageSize = nPageSize;
            conditionResult.TotalCount = totalCount;
            conditionResult.TotalPage = (int)Math.Ceiling((double)totalCount / nPageSize);
            conditionResult.PageIndex = nPageIndex;
            return conditionResult;
        }

        /// <summary>
        /// 获取第一行第一列
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="whereClip"></param>
        /// <returns></returns>
        public int GetCount<T>(WhereClip<T> whereClip) where T : BaseEntity, new()
        {
            Type type = new T().GetType();

            string whereString = string.Empty;

            if (whereClip != null)
                whereString = whereClip.WhereString;

            string tableName = DbEntityUtils.GetTableName(type);//获取表名

            string commandText = BuildSql.GetCountSql(tableName, whereString);

            执行SQL命令  
            object val = null;
            if (whereClip != null)
            {
                DbParameter[] parms = SqlOpera.MakeInParams(whereClip.Table);
                val = SqlOpera.ExecuteScalar(CommandType.Text, commandText, parms);
            }
            else
                val = SqlOpera.ExecuteScalar(CommandType.Text, commandText);

            //返回所影响的行数
            return Utils.StrToInt(val, 0);
        }

ManagerBLL 必须实现 EntityManager 接口,部分代码还未贴。


------------------------------------------------------------------

整理中。。。。。

猜你喜欢

转载自blog.csdn.net/ysq5202121/article/details/7520915