利用C#的动态类型来实现与rails类似的元编程(2)

在上一篇的文章中,主要介绍了利用CodeDom来动态生成数据库表到实体的映射关系以及利用C#的动态类型来操作实体的属性。这篇主要是实现了实体类的数据库CRUD的操作。

 

在目前的ORM映射框架中,对于操作数据库的最后一个步骤就是动态生成操作数据库的SQL语句,而这无非也就是利用实体属性中的自定义映射机制来实现的,或者就是直接把实体类的属性名对应表的字段名,在本示例中,就是采用的后者。

 

第一、为了能够存储动态生成的SQL语句,新建了一个SQL语句的结构类,用来存放SQL语句以及参数:

    /// <summary>
    /// SQL结构类
    /// </summary>
    [Serializable]
    class SqlStruct
    {
        public string SqlString  { get; set; }
        public ParamField[] ParamFields { get; set; }  
    }

 

    /// <summary>
    /// SQL参数
    /// </summary>
    [Serializable]
    public class ParamField
    {
        public string ParamName { get; set; }
        public string FieldName{  get; set; }
    }

 

第二、实现构建SQL操作

根据用户的CRUD操作,动态的构建一个SQL操作语句,并别存入缓存中,以便下次执行相同的操作时直接从缓存中获取,提高性能,在这里新建了一个构建SQL的类:

 class SqlGenerator
    {
        private SqlGenerator() { }

        private static SqlGenerator singleton = new SqlGenerator();

 public static SqlGenerator Instance()
 {
         return singleton;
 }

 

        /// <summary>
        /// 构建CRUD操作SQL语句
        /// </summary>
        /// <param name="activeRecord"></param>
        /// <param name="sqlOperationType"></param>
        /// <returns></returns>
        public SqlStruct GenerateSql(dynamic activeRecord, SqlOperationType sqlOperationType)
        {
            SqlStruct sqlStruct;
            string key = null;
            if (activeRecord is Type)
            {
                TableMapAttribute attr = Attribute.GetCustomAttribute(activeRecord, typeof(TableMapAttribute)) as TableMapAttribute;
                key = GenerateKey(attr.TableName, sqlOperationType);
            }
            else
            {
                key = GenerateKey(activeRecord.TableName, sqlOperationType);
            }
            // 获取缓存
            sqlStruct = CacheProxy.GetChchedString(key) as SqlStruct;
            if (sqlStruct != null)
            {
                return sqlStruct;
            }

            switch (sqlOperationType)
            {
                case SqlOperationType.SimpleSelect:
                    sqlStruct = new SqlStruct() { SqlString = GenerateSimpleSelectSql(activeRecord)};
                    break;
                case SqlOperationType.SelectByKey:
                    sqlStruct = GenerateFindByKeySql(activeRecord);
                    break;
                case SqlOperationType.Insert:
                    sqlStruct = GenerateInsertSql(activeRecord);
                    break;
                case SqlOperationType.Update:
                    sqlStruct = GenerateUpdateSql(activeRecord);
                    break;
                case SqlOperationType.Delete:
                    sqlStruct = GenerateDeleteSql(activeRecord);
                    break;<

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值