コード例 #1
0
        /// <summary>
        /// 创建索引脚本
        /// </summary>
        /// <param name="filed"></param>
        /// <returns></returns>
        public override string GetColumnIndexScript(Attribute.FieldAttribute filed)
        {
            string indexName   = string.Format("pk_{0}_{1}", filed.TableName, filed.Name);
            string indexScript = string.Format("create {3} index {0} on {1}({2}); ", indexName, filed.TableName, filed.KeyWordName, filed.FieldIndexType == Attribute.FieldIndexType.非聚集唯一 ? "UNIQUE" : "");

            return(indexScript);
        }
コード例 #2
0
        /// <summary>
        /// 获取插入语法
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public override object InsertObject(DbContext dbContext, IModel obj)
        {
            var    helper   = dbContext.DBHelper;
            Type   type     = obj.GetType();
            string table    = TypeCache.GetTableName(type, dbContext);
            var    typeArry = TypeCache.GetProperties(type, true).Values;

            Attribute.FieldAttribute primaryKey = null;
            string sql  = string.Format("insert into `{0}`(", table);
            string sql1 = "";
            string sql2 = "";

            foreach (Attribute.FieldAttribute info in typeArry)
            {
                //if (info.FieldType != Attribute.FieldType.数据库字段)
                //{
                //    continue;
                //}
                string name = info.MapingName;
                if (info.IsPrimaryKey)
                {
                    primaryKey = info;
                }
                if (info.IsPrimaryKey && !info.KeepIdentity)
                {
                    continue;
                }
                //if (!string.IsNullOrEmpty(info.VirtualField))
                //{
                //    continue;
                //}
                object value = info.GetValue(obj);
                if (info.PropertyType.FullName.StartsWith("System.Nullable"))//Nullable<T>类型为空值不插入
                {
                    if (value == null)
                    {
                        continue;
                    }
                }
                value = ObjectConvert.CheckNullValue(value, info.PropertyType);
                sql1 += string.Format("{0},", FieldNameFormat(info));
                sql2 += string.Format("?{0},", name);
                helper.AddParam(name, value);
            }
            sql1 = sql1.Substring(0, sql1.Length - 1);
            sql2 = sql2.Substring(0, sql2.Length - 1);
            sql += sql1 + ") values( " + sql2 + ") ; ";
            sql  = SqlFormat(sql);
            if (primaryKey.KeepIdentity)
            {
                helper.Execute(sql);
                return(primaryKey.GetValue(obj));
            }
            else
            {
                sql += "SELECT LAST_INSERT_ID();";
                return(SqlStopWatch.ExecScalar(helper, sql));
            }
        }
コード例 #3
0
 public string FieldNameFormat(Attribute.FieldAttribute field)
 {
     if (string.IsNullOrEmpty(field.MapingNameFormat))
     {
         field.MapingNameFormat = KeyWordFormat(field.MapingName);
     }
     return(field.MapingNameFormat);
 }
コード例 #4
0
 public override string FieldNameFormat(Attribute.FieldAttribute field)
 {
     if (string.IsNullOrEmpty(field.MapingNameFormat))
     {
         return(field.MapingName);
     }
     return(field.MapingNameFormat);
 }
コード例 #5
0
        /// <summary>
        /// 获取插入语法
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public override int InsertObject(IModel obj)
        {
            Type   type     = obj.GetType();
            string table    = TypeCache.GetTableName(type, dbContext);
            var    typeArry = TypeCache.GetProperties(type, true).Values;

            Attribute.FieldAttribute primaryKey = null;
            string sql  = string.Format("insert into [{0}](", table);
            string sql1 = "";
            string sql2 = "";

            foreach (Attribute.FieldAttribute info in typeArry)
            {
                string name = info.Name;
                if (info.IsPrimaryKey)
                {
                    primaryKey = info;
                }
                if (info.IsPrimaryKey && !info.KeepIdentity)
                {
                    continue;
                }
                if (!string.IsNullOrEmpty(info.VirtualField))
                {
                    continue;
                }
                object value = info.GetValue(obj);
                if (info.PropertyType.FullName.StartsWith("System.Nullable"))//Nullable<T>类型为空值不插入
                {
                    if (value == null)
                    {
                        continue;
                    }
                }
                value = ObjectConvert.SetNullValue(value, info.PropertyType);
                sql1 += string.Format("{0},", info.KeyWordName);
                sql2 += string.Format("@{0},", name);
                helper.AddParam(name, value);
            }
            sql1 = sql1.Substring(0, sql1.Length - 1);
            sql2 = sql2.Substring(0, sql2.Length - 1);
            sql += sql1 + ") values( " + sql2 + ") ; ";
            if (primaryKey.KeepIdentity)
            {
                sql += "SELECT " + primaryKey.GetValue(obj) + ";";
            }
            else
            {
                sql += "SELECT scope_identity() ;";
            }
            sql = SqlFormat(sql);
            return(Convert.ToInt32(helper.ExecScalar(sql)));
        }
コード例 #6
0
        /// <summary>
        /// 创建索引脚本
        /// </summary>
        /// <param name="filed"></param>
        /// <returns></returns>
        public override string GetColumnIndexScript(Attribute.FieldAttribute filed)
        {
            if (filed.IsPrimaryKey)
            {
                return("");
                //mssql不能用语句设为自增
                //return string.Format("alter table [{0}] add constraint PK{0} primary key ([{0}])", filed.TableName, filed.MapingName);
            }
            string indexScript = string.Format("CREATE {2} NONCLUSTERED INDEX  IX_INDEX_{0}_{1}  ON dbo.[{0}]([{1}])", filed.TableName, filed.MapingName, filed.FieldIndexType == Attribute.FieldIndexType.非聚集唯一 ? "UNIQUE" : "");

            return(indexScript);
        }
コード例 #7
0
        /// <summary>
        /// 获取列类型和默认值
        /// </summary>
        /// <param name="info"></param>
        /// <param name="defaultValue"></param>
        /// <returns></returns>
        public override string GetColumnType(Attribute.FieldAttribute info, out string defaultValue)
        {
            Type propertyType = info.PropertyType;

            //Dictionary<Type, string> dic = GetFieldMaping();
            defaultValue = info.DefaultValue;

            //int默认值
            if (string.IsNullOrEmpty(defaultValue))
            {
                if (!info.IsPrimaryKey && propertyType == typeof(System.Int32))
                {
                    defaultValue = "0";
                }
                //datetime默认值
                if (propertyType == typeof(System.DateTime))
                {
                    defaultValue = " CURRENT_TIMESTAMP";
                }
            }
            string columnType;

            columnType = GetDBColumnType(propertyType);
            //超过3000设为ntext
            if (propertyType == typeof(System.String) && info.Length > 3000)
            {
                columnType = "varchar(max)";
            }
            if (info.Length > 0)
            {
                columnType = string.Format(columnType, info.Length);
            }
            if (info.IsPrimaryKey)
            {
                if (info.KeepIdentity)
                {
                    columnType = " " + columnType + " primary key";
                }
                else
                {
                    //todo 只有数值型才能自增
                    columnType = " " + columnType + " primary key auto_increment";
                }
            }

            if (!string.IsNullOrEmpty(info.ColumnType))
            {
                columnType = info.ColumnType;
            }
            return(columnType);
        }
コード例 #8
0
ファイル: MSSQLDBAdapter.cs プロジェクト: qaz734913414/CRL2
        /// <summary>
        /// 获取列类型和默认值
        /// </summary>
        /// <param name="info"></param>
        /// <param name="defaultValue"></param>
        /// <returns></returns>
        public override string GetColumnType(Attribute.FieldAttribute info, out string defaultValue)
        {
            Type propertyType             = info.PropertyType;
            Dictionary <Type, string> dic = GetFieldMapping();

            defaultValue = info.DefaultValue;

            //int默认值
            if (string.IsNullOrEmpty(defaultValue))
            {
                if (!info.IsPrimaryKey && propertyType == typeof(System.Int32))
                {
                    defaultValue = "(0)";
                }
                //datetime默认值
                if (propertyType == typeof(System.DateTime))
                {
                    defaultValue = "(getdate())";
                }
            }
            string columnType;

            if (propertyType.FullName.IndexOf("System.") > -1)
            {
                columnType = dic[propertyType];
            }
            else
            {
                propertyType = info.PropertyType.BaseType;
                columnType   = dic[propertyType];
            }
            //超过3000设为ntext
            if (propertyType == typeof(System.String) && info.Length > 3000)
            {
                columnType = "ntext";
            }
            if (info.Length > 0)
            {
                columnType = string.Format(columnType, info.Length);
            }
            if (info.IsPrimaryKey)
            {
                columnType = "int IDENTITY(1,1) NOT NULL";
            }
            if (!string.IsNullOrEmpty(info.ColumnType))
            {
                columnType = info.ColumnType;
            }
            return(columnType);
        }
コード例 #9
0
ファイル: MSSQLDBAdapter.cs プロジェクト: datetime2/CRL3
        /// <summary>
        /// 获取列类型和默认值
        /// </summary>
        /// <param name="info"></param>
        /// <param name="defaultValue"></param>
        /// <returns></returns>
        public override string GetColumnType(Attribute.FieldAttribute info, out string defaultValue)
        {
            Type propertyType = info.PropertyType;

            //Dictionary<Type, string> dic = GetFieldMaping();
            defaultValue = info.DefaultValue;

            //int默认值
            if (string.IsNullOrEmpty(defaultValue))
            {
                if (!info.IsPrimaryKey && propertyType == typeof(System.Int32))
                {
                    defaultValue = "(0)";
                }
                //datetime默认值
                if (propertyType == typeof(System.DateTime))
                {
                    defaultValue = "(getdate())";
                }
            }
            string columnType;

            columnType = GetDBColumnType(propertyType);
            //超过3000设为ntext
            if (propertyType == typeof(System.String) && info.Length > 3000)
            {
                columnType = "ntext";
            }
            if (info.Length > 0)
            {
                columnType = string.Format(columnType, info.Length);
            }
            if (info.IsPrimaryKey)
            {
                if (info.KeepIdentity)
                {
                    columnType = columnType + " ";
                }
                else
                {
                    //todo 只有数值型才能自增
                    columnType = columnType + " IDENTITY(1,1) ";
                }
            }
            if (!string.IsNullOrEmpty(info.ColumnType))
            {
                columnType = info.ColumnType;
            }
            return(columnType);
        }
コード例 #10
0
ファイル: MySQLDBAdapter.cs プロジェクト: qaz734913414/CRL2
        /// <summary>
        /// 获取列类型和默认值
        /// </summary>
        /// <param name="info"></param>
        /// <param name="defaultValue"></param>
        /// <returns></returns>
        public override string GetColumnType(Attribute.FieldAttribute info, out string defaultValue)
        {
            Type propertyType             = info.PropertyType;
            Dictionary <Type, string> dic = GetFieldMapping();

            defaultValue = info.DefaultValue;

            //int默认值
            if (string.IsNullOrEmpty(defaultValue))
            {
                if (!info.IsPrimaryKey && propertyType == typeof(System.Int32))
                {
                    defaultValue = "0";
                }
                //datetime默认值
                if (propertyType == typeof(System.DateTime))
                {
                    defaultValue = " CURRENT_TIMESTAMP";
                }
            }
            string columnType;

            if (propertyType.FullName.IndexOf("System.") > -1)
            {
                columnType = dic[propertyType];
            }
            else
            {
                propertyType = info.PropertyType.BaseType;
                columnType   = dic[propertyType];
            }
            //超过3000设为ntext
            if (propertyType == typeof(System.String) && info.Length > 3000)
            {
                columnType = "varchar(8000)";
            }
            if (info.Length > 0)
            {
                columnType = string.Format(columnType, info.Length);
            }
            if (info.IsPrimaryKey)
            {
                columnType = "int primary key not  null  auto_increment";
            }
            if (!string.IsNullOrEmpty(info.ColumnType))
            {
                columnType = info.ColumnType;
            }
            return(columnType);
        }
コード例 #11
0
        /// <summary>
        /// 创建字段脚本
        /// </summary>
        /// <param name="field"></param>
        /// <returns></returns>
        public override string GetCreateColumnScript(Attribute.FieldAttribute field)
        {
            string str = string.Format("alter table {0} add {1} {2};", field.TableName, field.KeyWordName, field.ColumnType);

            if (!string.IsNullOrEmpty(field.DefaultValue))
            {
                str += string.Format(" default '{0}' ", field.DefaultValue);
            }
            if (field.NotNull)
            {
                str += " not null";
            }
            return(str);
        }
コード例 #12
0
        /// <summary>
        /// 创建索引脚本
        /// </summary>
        /// <param name="filed"></param>
        /// <returns></returns>
        public override string GetColumnIndexScript(Attribute.FieldAttribute filed)
        {
            //            ALTER TABLE table_name ADD INDEX index_name (column_list)
            //ALTER TABLE table_name ADD UNIQUE(column_list)
            //ALTER TABLE table_name ADD PRIMARY KEY(column_list)
            if (filed.IsPrimaryKey)
            {
                return("");

                return(string.Format("ALTER TABLE `{0}` modify `{1}` int auto_increment", filed.TableName, filed.MapingName));
            }
            string indexScript = string.Format("ALTER TABLE `{0}` ADD {2} ({1}) ", filed.TableName, filed.MapingName,
                                               filed.FieldIndexType == Attribute.FieldIndexType.非聚集唯一 ? "UNIQUE" : "INDEX index_" + filed.MapingName);

            return(indexScript);
        }
コード例 #13
0
        /// <summary>
        /// 获取列类型和默认值
        /// </summary>
        /// <param name="info"></param>
        /// <param name="defaultValue"></param>
        /// <returns></returns>
        public override string GetColumnType(Attribute.FieldAttribute info, out string defaultValue)
        {
            Type propertyType = info.PropertyType;

            //Dictionary<Type, string> dic = GetFieldMaping();
            defaultValue = info.DefaultValue;

            //int默认值
            if (string.IsNullOrEmpty(defaultValue))
            {
                if (!info.IsPrimaryKey && propertyType == typeof(System.Int32))
                {
                    defaultValue = "0";
                }
                //datetime默认值
                if (propertyType == typeof(System.DateTime))
                {
                    defaultValue = "TIMESTAMP";
                }
            }
            string columnType;

            columnType = GetDBColumnType(propertyType);
            //超过3000设为ntext
            if (propertyType == typeof(System.String) && info.Length > 3000)
            {
                columnType = "CLOB";
            }
            if (info.Length > 0)
            {
                columnType = string.Format(columnType, info.Length);
            }
            //if (info.IsPrimaryKey)
            //{
            //    columnType = "NUMBER(4) Not Null Primary Key";
            //}
            if (info.IsPrimaryKey)
            {
                columnType = " " + columnType + " Primary Key ";
            }

            if (!string.IsNullOrEmpty(info.ColumnType))
            {
                columnType = info.ColumnType;
            }
            return(columnType);
        }
コード例 #14
0
        /// <summary>
        /// 解析选择的字段
        /// </summary>
        /// <param name="isSelect">查询字段时按属性名生成别名</param>
        /// <param name="expressionBody"></param>
        /// <param name="withTablePrefix">是否生按表生成前辍,关联时用 如Table__Name</param>
        /// <param name="types"></param>
        /// <returns></returns>
        internal SelectFieldInfo GetSelectField(bool isSelect, Expression expressionBody, bool withTablePrefix, params Type[] types)
        {
            var allFields = new Dictionary <Type, IgnoreCaseDictionary <Attribute.FieldAttribute> >();

            allFields.Add(__MainType, TypeCache.GetProperties(__MainType, true));
            foreach (var t in types)
            {
                if (!allFields.ContainsKey(t))
                {
                    allFields.Add(t, TypeCache.GetProperties(t, true));
                }
            }

            if (expressionBody is ParameterExpression)//选择所有字段
            {
                var resultFields = new List <Attribute.FieldMapping>();
                foreach (var item in allFields[expressionBody.Type].Values)
                {
                    var item2 = item.GetFieldMapping(__DBAdapter, GetPrefix(item.ModelType), false, "");
                    resultFields.Add(item2);
                }
                var selectFieldItem = new SelectFieldInfo(resultFields);
                return(selectFieldItem);
            }
            else if (expressionBody is NewExpression)//按匿名对象
            {
                var resultFields = new List <Attribute.FieldMapping>();
                #region  匿名对象

                var newExpression = expressionBody as NewExpression;
                for (int i = 0; i < newExpression.Arguments.Count(); i++)
                {
                    var item       = newExpression.Arguments[i];
                    var memberName = newExpression.Members[i].Name;
                    if (item is MethodCallExpression)//group用
                    {
                        var    methodCallExpression = item as MethodCallExpression;
                        string methodMember;
                        var    methodQuery = getSelectMethodCall(methodCallExpression, out methodMember, i);
                        var    f           = new Attribute.FieldAttribute()
                        {
                            ModelType = __MainType, MemberName = memberName, PropertyType = item.Type
                        };
                        var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, methodQuery);
                        f2.MethodName = methodCallExpression.Method.Name;
                        resultFields.Add(f2);
                    }
                    else if (item is BinaryExpression)
                    {
                        var field = getSeletctBinary(item);
                        var f     = new Attribute.FieldAttribute()
                        {
                            ModelType = __MainType, MemberName = "", PropertyType = item.Type
                        };
                        var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, field);
                        resultFields.Add(f2);
                    }
                    else if (item is ConstantExpression)//常量
                    {
                        var constantExpression = item as ConstantExpression;
                        var f = new Attribute.FieldAttribute()
                        {
                            ModelType = __MainType, MemberName = "", PropertyType = item.Type
                        };
                        var value = constantExpression.Value + "";
                        if (!value.IsNumber())
                        {
                            value = string.Format("'{0}'", value);
                        }
                        var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, value);
                        //f.FieldQuery = new Attribute.FieldQuery() { MemberName = memberName, FieldName = value, MethodName = "" };
                        resultFields.Add(f2);
                    }
                    else if (item is MemberExpression)
                    {
                        var memberExpression = item as MemberExpression;//转换为属性访问表达式
                        if (memberExpression.Expression.NodeType == ExpressionType.Constant)
                        {
                            string parName = __DBAdapter.GetParamName("p", i);
                            //newExpressionParame.Add(parName, i);
                            var obj = ConstantValueVisitor.GetParameExpressionValue(item);
                            var f2  = new Attribute.FieldAttribute()
                            {
                                ModelType = __MainType, PropertyType = item.Type
                            };
                            var f3 = f2.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, parName);
                            //f2.FieldQuery = new Attribute.FieldQuery() { MemberName = memberName, FieldName = parName, MethodName = "" };
                            resultFields.Add(f3);
                            __Visitor.AddParame(parName, obj);
                            continue;
                        }
                        else if (memberExpression.Member.ReflectedType.Name.StartsWith("<>f__AnonymousType"))
                        {
                            //按匿名对象属性,视图关联时用
                            var f2 = new Attribute.FieldAttribute()
                            {
                                MemberName = memberExpression.Member.Name, PropertyType = item.Type
                            };
                            var f3 = f2.GetFieldMapping(__DBAdapter, GetPrefix(memberExpression.Expression.Type), withTablePrefix, memberName);
                            resultFields.Add(f3);
                            continue;
                        }
                        //按属性
                        Attribute.FieldAttribute f;
                        var a2 = allFields[memberExpression.Expression.Type].TryGetValue(memberExpression.Member.Name, out f);
                        if (!a2)
                        {
                            throw new CRLException("找不到可筛选的属性" + memberExpression.Member.Name + " 在" + memberExpression.Expression.Type);
                        }
                        Attribute.FieldMapping _f2;
                        if (memberName != memberExpression.Member.Name)//按有别名算
                        {
                            _f2 = f.GetFieldMapping(__DBAdapter, GetPrefix(f.ModelType), withTablePrefix, memberName);
                        }
                        else
                        {
                            //字段名和属性名不一样时才生成别名
                            //todo 属性别名不一样时,查询应返回属性名
                            string fieldName = "";
                            if (isSelect)//查询字段时按属性名生成别名
                            {
                                if (!string.IsNullOrEmpty(f.MapingName))
                                {
                                    fieldName = f.MemberName;
                                }
                            }
                            _f2 = f.GetFieldMapping(__DBAdapter, GetPrefix(f.ModelType), withTablePrefix, fieldName);
                        }
                        //f.FieldQuery = new Attribute.FieldQuery() { MemberName = memberName, FieldName = f.MapingName, MethodName = "" };
                        resultFields.Add(_f2);
                    }
                    else
                    {
                        throw new CRLException("不支持此语法解析:" + item);
                    }
                }
                #endregion
                var selectFieldItem = new SelectFieldInfo(resultFields);
                return(selectFieldItem);
            }
            else if (expressionBody is MethodCallExpression)
            {
                #region 方法
                var method = expressionBody as MethodCallExpression;
                var f      = new Attribute.FieldAttribute()
                {
                    ModelType = __MainType, MemberName = "", PropertyType = expressionBody.Type
                };
                string methodMember;
                var    methodQuery = getSelectMethodCall(expressionBody, out methodMember, 0);
                var    f2          = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, "", methodQuery);
                f2.MethodName = method.Method.Name;
                #endregion
                var selectFieldItem = new SelectFieldInfo(f2);
                return(selectFieldItem);
            }
            else if (expressionBody is BinaryExpression)
            {
                var field = getSeletctBinary(expressionBody);
                var f     = new Attribute.FieldAttribute()
                {
                    ModelType = __MainType, MemberName = "", PropertyType = expressionBody.Type
                };
                var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, "", field);
                var selectFieldItem = new SelectFieldInfo(f2);
                return(selectFieldItem);
            }
            else if (expressionBody is ConstantExpression)
            {
                var constant = (ConstantExpression)expressionBody;
                var f        = new Attribute.FieldAttribute()
                {
                    ModelType = __MainType, MemberName = "", PropertyType = expressionBody.Type
                };
                var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, "", constant.Value + "");
                var selectFieldItem = new SelectFieldInfo(f2);
                return(selectFieldItem);
            }
            else if (expressionBody is UnaryExpression)
            {
                var unaryExpression = expressionBody as UnaryExpression;
                return(GetSelectField(false, unaryExpression.Operand, withTablePrefix, types));
            }
            else if (expressionBody is MemberExpression)//按成员
            {
                #region MemberExpression
                var mExp = (MemberExpression)expressionBody;
                if (mExp.Expression.Type.BaseType == typeof(object))
                {
                    //按匿名对象属性,视图关联时用
                    var _f = new Attribute.FieldAttribute()
                    {
                        MemberName = mExp.Member.Name, PropertyType = mExp.Type
                    };
                    var f3 = _f.GetFieldMapping(__DBAdapter, GetPrefix(mExp.Expression.Type), withTablePrefix, mExp.Member.Name);
                    return(new SelectFieldInfo(f3));
                }
                CRL.Attribute.FieldAttribute f;
                var a = allFields[mExp.Expression.Type].TryGetValue(mExp.Member.Name, out f);
                if (!a)
                {
                    throw new CRLException("找不到可筛选的属性" + mExp.Member.Name + " 在" + mExp.Expression.Type);
                }
                var f2 = f.GetFieldMapping(__DBAdapter, GetPrefix(f.ModelType), withTablePrefix, "");
                return(new SelectFieldInfo(f2));

                #endregion
            }
            else
            {
                throw new CRLException("不支持此语法解析:" + expressionBody);
            }
        }
コード例 #15
0
ファイル: MSSQLDBAdapter.cs プロジェクト: qaz734913414/CRL2
        /// <summary>
        /// 创建索引脚本
        /// </summary>
        /// <param name="filed"></param>
        /// <returns></returns>
        public override string GetColumnIndexScript(Attribute.FieldAttribute filed)
        {
            string indexScript = string.Format("CREATE {2} NONCLUSTERED INDEX  IX_INDEX_{0}_{1}  ON dbo.[{0}]([{1}])", filed.TableName, filed.Name, filed.FieldIndexType == Attribute.FieldIndexType.非聚集唯一 ? "UNIQUE" : "");

            return(indexScript);
        }
コード例 #16
0
        /// <summary>
        /// 解析选择的字段
        /// </summary>
        /// <param name="isSelect">查询字段时按属性名生成别名</param>
        /// <param name="expressionBody"></param>
        /// <param name="withTablePrefix">是否生按表生成前辍,关联时用 如Table__Name</param>
        /// <param name="types"></param>
        /// <returns></returns>
        internal List <Attribute.FieldAttribute> GetSelectField(bool isSelect, Expression expressionBody, bool withTablePrefix, params Type[] types)
        {
            var allFilds = new Dictionary <Type, IgnoreCaseDictionary <Attribute.FieldAttribute> >();

            allFilds.Add(__MainType, TypeCache.GetProperties(__MainType, true));
            foreach (var t in types)
            {
                if (!allFilds.ContainsKey(t))
                {
                    allFilds.Add(t, TypeCache.GetProperties(t, true));
                }
            }
            List <Attribute.FieldAttribute> resultFields = new List <Attribute.FieldAttribute>();

            if (expressionBody is NewExpression)//按匿名对象
            {
                #region  匿名对象
                var newExpression = expressionBody as NewExpression;
                for (int i = 0; i < newExpression.Arguments.Count(); i++)
                {
                    var item       = newExpression.Arguments[i];
                    var memberName = newExpression.Members[i].Name;
                    if (item is MethodCallExpression)//group用
                    {
                        var    methodCallExpression = item as MethodCallExpression;
                        string methodMember;
                        var    methodQuery = getSelectMethodCall(methodCallExpression, out methodMember);
                        var    f           = new Attribute.FieldAttribute()
                        {
                            ModelType = __MainType
                        };
                        f.SetFieldQueryScript2(__DBAdapter, "", withTablePrefix, memberName, methodQuery);
                        f.FieldQuery = new Attribute.FieldQuery()
                        {
                            MemberName = memberName, FieldName = methodMember, MethodName = methodCallExpression.Method.Name
                        };
                        resultFields.Add(f);
                    }
                    else if (item is BinaryExpression)
                    {
                        var field = getSeletctBinary(item);
                        var f     = new Attribute.FieldAttribute()
                        {
                            ModelType = __MainType
                        };
                        f.SetFieldQueryScript2(__DBAdapter, "", withTablePrefix, memberName, field);
                        f.FieldQuery = new Attribute.FieldQuery()
                        {
                            MemberName = memberName, FieldName = field, MethodName = ""
                        };
                        resultFields.Add(f);
                    }
                    else if (item is ConstantExpression)//常量
                    {
                        var constantExpression = item as ConstantExpression;
                        var f = new Attribute.FieldAttribute()
                        {
                            ModelType = __MainType
                        };
                        var value = constantExpression.Value + "";
                        if (!value.IsNumber())
                        {
                            value = string.Format("'{0}'", value);
                        }
                        f.SetFieldQueryScript2(__DBAdapter, "", withTablePrefix, memberName, value);
                        f.FieldQuery = new Attribute.FieldQuery()
                        {
                            MemberName = memberName, FieldName = value, MethodName = ""
                        };
                        resultFields.Add(f);
                    }
                    else if (item is MemberExpression)
                    {
                        var memberExpression = item as MemberExpression;//转换为属性访问表达式
                        if (memberExpression.Expression.Type.BaseType == typeof(object))
                        {
                            //按匿名对象属性,视图关联时用
                            var f2 = new Attribute.FieldAttribute()
                            {
                                MemberName = memberExpression.Member.Name
                            };
                            f2.SetFieldQueryScript2(__DBAdapter, GetPrefix(memberExpression.Expression.Type), withTablePrefix, memberName);
                            resultFields.Add(f2);
                            continue;
                        }
                        if (!allFilds[memberExpression.Expression.Type].ContainsKey(memberExpression.Member.Name))
                        {
                            throw new CRLException("找不到可筛选的属性" + memberExpression.Member.Name + " 在" + memberExpression.Expression.Type);
                        }
                        var f = allFilds[memberExpression.Expression.Type][memberExpression.Member.Name].Clone();
                        if (memberName != memberExpression.Member.Name)//按有别名算
                        {
                            f.SetFieldQueryScript2(__DBAdapter, GetPrefix(f.ModelType), withTablePrefix, memberName);
                        }
                        else
                        {
                            //字段名和属性名不一样时才生成别名
                            //todo 属性别名不一样时,查询应返回属性名
                            string fieldName = "";
                            if (isSelect)//查询字段时按属性名生成别名
                            {
                                if (!string.IsNullOrEmpty(f.MapingName))
                                {
                                    fieldName = f.MemberName;
                                }
                            }
                            f.SetFieldQueryScript2(__DBAdapter, GetPrefix(f.ModelType), withTablePrefix, fieldName);
                        }
                        f.FieldQuery = new Attribute.FieldQuery()
                        {
                            MemberName = memberName, FieldName = f.MapingName, MethodName = ""
                        };
                        resultFields.Add(f);
                    }
                    else
                    {
                        throw new CRLException("不支持此语法解析:" + item);
                    }
                }
                #endregion
            }
            else if (expressionBody is MethodCallExpression)
            {
                #region 方法
                var method = expressionBody as MethodCallExpression;
                var f      = new Attribute.FieldAttribute()
                {
                    ModelType = __MainType
                };
                string methodMember;
                var    methodQuery = getSelectMethodCall(expressionBody, out methodMember);
                f.SetFieldQueryScript2(__DBAdapter, "", withTablePrefix, "", methodQuery);
                f.FieldQuery = new Attribute.FieldQuery()
                {
                    MemberName = methodMember, FieldName = methodMember, MethodName = method.Method.Name
                };
                resultFields.Add(f);
                #endregion
            }
            else if (expressionBody is BinaryExpression)
            {
                var field = getSeletctBinary(expressionBody);
                var f     = new Attribute.FieldAttribute()
                {
                    ModelType = __MainType
                };
                f.SetFieldQueryScript2(__DBAdapter, "", withTablePrefix, "", field);
                f.FieldQuery = new Attribute.FieldQuery()
                {
                    MemberName = f.MemberName, FieldName = field, MethodName = ""
                };
                resultFields.Add(f);
            }
            else if (expressionBody is ConstantExpression)
            {
                var constant = (ConstantExpression)expressionBody;
                var f        = new Attribute.FieldAttribute()
                {
                    ModelType = __MainType
                };
                f.SetFieldQueryScript2(__DBAdapter, "", withTablePrefix, "", constant.Value + "");
                f.FieldQuery = new Attribute.FieldQuery()
                {
                    MemberName = f.MemberName, FieldName = constant.Value + "", MethodName = ""
                };
                resultFields.Add(f);
            }
            else if (expressionBody is UnaryExpression)
            {
                var unaryExpression = expressionBody as UnaryExpression;
                return(GetSelectField(false, unaryExpression.Operand, withTablePrefix, types));
            }
            else if (expressionBody is MemberExpression)//按成员
            {
                var mExp = (MemberExpression)expressionBody;
                if (mExp.Expression.Type.BaseType == typeof(object))
                {
                    //按匿名对象属性,视图关联时用
                    var f2 = new Attribute.FieldAttribute()
                    {
                        MemberName = mExp.Member.Name
                    };
                    f2.SetFieldQueryScript2(__DBAdapter, GetPrefix(mExp.Expression.Type), withTablePrefix, mExp.Member.Name);
                    resultFields.Add(f2);
                    return(resultFields);;
                }

                if (!allFilds[mExp.Expression.Type].ContainsKey(mExp.Member.Name))
                {
                    throw new CRLException("找不到可筛选的属性" + mExp.Member.Name + " 在" + mExp.Expression.Type);
                }
                var f = allFilds[mExp.Expression.Type][mExp.Member.Name].Clone();
                f.SetFieldQueryScript2(__DBAdapter, GetPrefix(f.ModelType), withTablePrefix, "");
                f.FieldQuery = new Attribute.FieldQuery()
                {
                    MemberName = f.MemberName, FieldName = f.MapingName, MethodName = ""
                };
                resultFields.Add(f);
            }
            else
            {
                throw new CRLException("不支持此语法解析:" + expressionBody);
            }
            return(resultFields);
        }
コード例 #17
0
ファイル: DBAdapterBase.cs プロジェクト: guojianbin/CRL3
 public virtual string FieldNameFormat(Attribute.FieldAttribute field)
 {
     return(field.MapingName);
 }
コード例 #18
0
 public override string GetCreateColumnScript(Attribute.FieldAttribute field)
 {
     throw new NotImplementedException();
 }
コード例 #19
0
 public override string GetColumnIndexScript(Attribute.FieldAttribute filed)
 {
     throw new NotImplementedException();
 }
コード例 #20
0
 public override string GetColumnType(Attribute.FieldAttribute info, out string defaultValue)
 {
     throw new NotImplementedException();
 }
コード例 #21
0
        /// <summary>
        /// 创建索引脚本
        /// </summary>
        /// <param name="filed"></param>
        /// <returns></returns>
        public override string GetColumnIndexScript(Attribute.FieldAttribute filed)
        {
            string indexScript = string.Format("ALTER TABLE `{0}` ADD {2} ({1}) ", filed.TableName, filed.MapingName, filed.FieldIndexType == Attribute.FieldIndexType.非聚集唯一 ? "UNIQUE" : "INDEX index_name");

            return(indexScript);
        }