Ejemplo n.º 1
0
        private static string ResolveParameterExpression(ParameterExpression expression)
        {
            var parameterType = (expression as ParameterExpression).Type;

            var typeMapping_parameterType = DbTypeMapping.TypeMapping(parameterType);

            if (typeMapping_parameterType.Equals(DbTypeMapping.List_UserType))
            {
                if (!types.Contains(parameterType))
                {
                    types.Add(parameterType);
                }

                return(null);
            }
            else if (typeMapping_parameterType.Equals(DbTypeMapping.UserType))
            {
                CreateJoin(parameterType.Name + "." + new ModelUtil(parameterType).PrimaryKeyPropertyName);

                if (!types.Contains(parameterType))
                {
                    types.Add(parameterType);
                }

                return((expression as ParameterExpression).Type.Name);
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 2
0
 public ColumnTypeMetadata(string dataTypeName, DbTypeMapping dbTypeMapping, MySqlDbType mySqlDbType, bool isUnsigned = false, bool binary = false, int length = 0, string?simpleDataTypeName = null, string?createFormat = null, long columnSize = 0)
 {
     DataTypeName       = dataTypeName;
     SimpleDataTypeName = simpleDataTypeName ?? dataTypeName;
     CreateFormat       = createFormat ?? (dataTypeName + (isUnsigned ? " UNSIGNED" : ""));
     DbTypeMapping      = dbTypeMapping;
     MySqlDbType        = mySqlDbType;
     ColumnSize         = columnSize;
     IsUnsigned         = isUnsigned;
     Binary             = binary;
     Length             = length;
 }
Ejemplo n.º 3
0
 private DbTypeMapping AddDbTypeMapping(DbTypeMapping dbTypeMapping)
 {
     m_dbTypeMappingsByClrType[dbTypeMapping.ClrType] = dbTypeMapping;
     if (dbTypeMapping.DbTypes != null)
     {
         DbType[] dbTypes = dbTypeMapping.DbTypes;
         foreach (DbType dbType in dbTypes)
         {
             m_dbTypeMappingsByDbType[dbType] = dbTypeMapping;
         }
     }
     return(dbTypeMapping);
 }
Ejemplo n.º 4
0
        public List <TModel> SelectModels <TModel>(Expression expression)
        {
            LambdaTranslator.MappingDataSet = MappingDataSet;

            TranslatorResult res = LambdaTranslator.ResolveExpression(expression, true);


            List <RelationModel> relations = new List <RelationModel>();

            List <string> tables = new List <string>();

            //遍历所有涉及到的关系
            foreach (var type in res.Types)
            {
                if (DbTypeMapping.TypeMapping(type).Equals(DbTypeMapping.UserType))
                {
                    var rls = MappingDataSet.GetRelation(type.Name);
                    relations.Add(rls);

                    tables.Add(rls.TbName);
                }
                else if (DbTypeMapping.TypeMapping(type).Equals(DbTypeMapping.List_UserType))
                {
                    //建立新的查询,
                }
            }

            var selectSql = Select.From(tables);

            foreach (var r in relations)
            {
                foreach (var c in r.Columns)
                {
                    selectSql.AddColumns(r.TbName + "." + c.ColumnName + " as " + r.TbName + "_" + c.ColumnName);
                }
            }
            selectSql.SetWhere(res.GetWhere());

            string sql_str = selectSql.ToSql().ToString();
            var    dataSet = GetDataSet(selectSql.ToSql());

            var tabless = dataSet.Tables;

            return(null);
        }
Ejemplo n.º 5
0
        public static string ResolveMemberExpression(MemberExpression expression)
        {
            //展开成员表达式
            if (!expressionCatches.Keys.Contains(expression.ToString()))
            {
                var memberType = expression.Type;

                var typeMapping_rightType = DbTypeMapping.TypeMapping(memberType);

                if (typeMapping_rightType.Equals(DbTypeMapping.List_UserType))
                {
                    //如果成员表达式的右边是集合类型
                    if (!types.Contains(memberType))
                    {
                        types.Add(memberType);
                    }

                    expressionCatches.Add(expression.ToString(), null);
                    return(null);
                }
                else if (typeMapping_rightType.Equals(DbTypeMapping.UserType))
                {
                    //如果成员表达式的右边是用户类型

                    CreateJoin(memberType.Name + "." + new ModelUtil(memberType).PrimaryKeyPropertyName); //构造多关系连接

                    if (!types.Contains(memberType))
                    {
                        types.Add(memberType);
                    }

                    if (expression.Expression.NodeType == ExpressionType.Parameter)
                    {
                        ResolveParameterExpression(expression.Expression as ParameterExpression);
                    }
                    else if (expression.Expression.NodeType == ExpressionType.MemberAccess)
                    {
                        ResolveMemberExpression(expression.Expression as MemberExpression);
                    }

                    expressionCatches.Add(expression.ToString(), null);
                    return(null);
                }
                else
                {
                    //如果成员表达式的右边是值类型
                    var memberName = expression.Member.Name;

                    string RelationName = null;

                    if (expression.Expression.NodeType == ExpressionType.Parameter)
                    {
                        RelationName = ResolveParameterExpression(expression.Expression as ParameterExpression);
                    }
                    else if (expression.Expression.NodeType == ExpressionType.MemberAccess)
                    {
                        RelationName = (expression.Expression as MemberExpression).Type.Name;

                        ResolveMemberExpression(expression.Expression as MemberExpression);
                    }

                    expressionCatches.Add(expression.ToString(), RelationName + "." + memberName);
                    return(RelationName + "." + memberName);
                }
            }
            else
            {
                return(expressionCatches[expression.ToString()]);
            }
        }
Ejemplo n.º 6
0
        static SqlParameter()
        {
            if (DbTypeMapping == null)
            {
                DbTypeMapping = new Hashtable();
            }

            DbTypeMapping.Add(SqlDbType.BigInt, typeof(long));
            DbTypeMapping.Add(SqlDbType.Bit, typeof(bool));
            DbTypeMapping.Add(SqlDbType.Char, typeof(string));
            DbTypeMapping.Add(SqlDbType.NChar, typeof(string));
            DbTypeMapping.Add(SqlDbType.Text, typeof(string));
            DbTypeMapping.Add(SqlDbType.NText, typeof(string));
            DbTypeMapping.Add(SqlDbType.VarChar, typeof(string));
            DbTypeMapping.Add(SqlDbType.NVarChar, typeof(string));
            DbTypeMapping.Add(SqlDbType.SmallDateTime, typeof(DateTime));
            DbTypeMapping.Add(SqlDbType.DateTime, typeof(DateTime));
            DbTypeMapping.Add(SqlDbType.DateTime2, typeof(DateTime));
            DbTypeMapping.Add(SqlDbType.DateTimeOffset, typeof(DateTimeOffset));
            DbTypeMapping.Add(SqlDbType.Decimal, typeof(decimal));
            DbTypeMapping.Add(SqlDbType.Float, typeof(double));
            DbTypeMapping.Add(SqlDbType.Binary, typeof(byte []));
            DbTypeMapping.Add(SqlDbType.Image, typeof(byte []));
            DbTypeMapping.Add(SqlDbType.Money, typeof(decimal));
            DbTypeMapping.Add(SqlDbType.SmallMoney, typeof(decimal));
            DbTypeMapping.Add(SqlDbType.VarBinary, typeof(byte []));
            DbTypeMapping.Add(SqlDbType.TinyInt, typeof(byte));
            DbTypeMapping.Add(SqlDbType.Int, typeof(int));
            DbTypeMapping.Add(SqlDbType.Real, typeof(float));
            DbTypeMapping.Add(SqlDbType.SmallInt, typeof(short));
            DbTypeMapping.Add(SqlDbType.UniqueIdentifier, typeof(Guid));
            DbTypeMapping.Add(SqlDbType.Variant, typeof(object));
            DbTypeMapping.Add(SqlDbType.Xml, typeof(string));

            type_mapping = new Hashtable();

            type_mapping.Add(typeof(long), SqlDbType.BigInt);
            type_mapping.Add(typeof(SqlTypes.SqlInt64), SqlDbType.BigInt);

            type_mapping.Add(typeof(bool), SqlDbType.Bit);
            type_mapping.Add(typeof(SqlTypes.SqlBoolean), SqlDbType.Bit);

            type_mapping.Add(typeof(char), SqlDbType.NVarChar);
            type_mapping.Add(typeof(char []), SqlDbType.NVarChar);
            type_mapping.Add(typeof(SqlTypes.SqlChars), SqlDbType.NVarChar);

            type_mapping.Add(typeof(string), SqlDbType.NVarChar);
            type_mapping.Add(typeof(SqlTypes.SqlString), SqlDbType.NVarChar);

            type_mapping.Add(typeof(DateTime), SqlDbType.DateTime);
            type_mapping.Add(typeof(SqlTypes.SqlDateTime), SqlDbType.DateTime);

            type_mapping.Add(typeof(decimal), SqlDbType.Decimal);
            type_mapping.Add(typeof(SqlTypes.SqlDecimal), SqlDbType.Decimal);

            type_mapping.Add(typeof(double), SqlDbType.Float);
            type_mapping.Add(typeof(SqlTypes.SqlDouble), SqlDbType.Float);

            type_mapping.Add(typeof(byte []), SqlDbType.VarBinary);
            type_mapping.Add(typeof(SqlTypes.SqlBinary), SqlDbType.VarBinary);

            type_mapping.Add(typeof(SqlTypes.SqlBytes), SqlDbType.VarBinary);

            type_mapping.Add(typeof(byte), SqlDbType.TinyInt);
            type_mapping.Add(typeof(SqlTypes.SqlByte), SqlDbType.TinyInt);

            type_mapping.Add(typeof(int), SqlDbType.Int);
            type_mapping.Add(typeof(SqlTypes.SqlInt32), SqlDbType.Int);

            type_mapping.Add(typeof(float), SqlDbType.Real);
            type_mapping.Add(typeof(SqlTypes.SqlSingle), SqlDbType.Real);

            type_mapping.Add(typeof(short), SqlDbType.SmallInt);
            type_mapping.Add(typeof(SqlTypes.SqlInt16), SqlDbType.SmallInt);

            type_mapping.Add(typeof(Guid), SqlDbType.UniqueIdentifier);
            type_mapping.Add(typeof(SqlTypes.SqlGuid), SqlDbType.UniqueIdentifier);

            type_mapping.Add(typeof(SqlTypes.SqlMoney), SqlDbType.Money);

            type_mapping.Add(typeof(XmlReader), SqlDbType.Xml);
            type_mapping.Add(typeof(SqlTypes.SqlXml), SqlDbType.Xml);

            type_mapping.Add(typeof(object), SqlDbType.Variant);
            type_mapping.Add(typeof(DateTimeOffset), SqlDbType.DateTimeOffset);
        }
Ejemplo n.º 7
0
    private TypeMapper()
    {
        m_columnTypeMetadata              = new List <ColumnTypeMetadata>();
        m_dbTypeMappingsByClrType         = new Dictionary <Type, DbTypeMapping>();
        m_dbTypeMappingsByDbType          = new Dictionary <DbType, DbTypeMapping>();
        m_columnTypeMetadataLookup        = new Dictionary <string, ColumnTypeMetadata>(StringComparer.OrdinalIgnoreCase);
        m_mySqlDbTypeToColumnTypeMetadata = new Dictionary <MySqlDbType, ColumnTypeMetadata>();
        DbTypeMapping typeBoolean = AddDbTypeMapping(new DbTypeMapping(typeof(bool), new DbType[1]
        {
            DbType.Boolean
        }, (object o) => Convert.ToBoolean(o)));

        AddColumnTypeMetadata(new ColumnTypeMetadata("TINYINT", typeBoolean, MySqlDbType.Bool, false, false, 1, "BOOL", "BOOL", 1L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("TINYINT", typeBoolean, MySqlDbType.Bool, true, false, 1, null, null, 0L));
        DbTypeMapping typeSbyte = AddDbTypeMapping(new DbTypeMapping(typeof(sbyte), new DbType[1]
        {
            DbType.SByte
        }, (object o) => Convert.ToSByte(o)));
        DbTypeMapping typeByte = AddDbTypeMapping(new DbTypeMapping(typeof(byte), new DbType[1]
        {
            DbType.Byte
        }, (object o) => Convert.ToByte(o)));
        DbTypeMapping typeShort = AddDbTypeMapping(new DbTypeMapping(typeof(short), new DbType[1]
        {
            DbType.Int16
        }, (object o) => Convert.ToInt16(o)));
        DbTypeMapping typeUshort = AddDbTypeMapping(new DbTypeMapping(typeof(ushort), new DbType[1]
        {
            DbType.UInt16
        }, (object o) => Convert.ToUInt16(o)));
        DbTypeMapping typeInt = AddDbTypeMapping(new DbTypeMapping(typeof(int), new DbType[1]
        {
            DbType.Int32
        }, (object o) => Convert.ToInt32(o)));
        DbTypeMapping typeUint = AddDbTypeMapping(new DbTypeMapping(typeof(uint), new DbType[1]
        {
            DbType.UInt32
        }, (object o) => Convert.ToUInt32(o)));
        DbTypeMapping typeLong = AddDbTypeMapping(new DbTypeMapping(typeof(long), new DbType[1]
        {
            DbType.Int64
        }, (object o) => Convert.ToInt64(o)));
        DbTypeMapping typeUlong = AddDbTypeMapping(new DbTypeMapping(typeof(ulong), new DbType[1]
        {
            DbType.UInt64
        }, (object o) => Convert.ToUInt64(o)));

        AddColumnTypeMetadata(new ColumnTypeMetadata("TINYINT", typeSbyte, MySqlDbType.Byte, false, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("TINYINT", typeByte, MySqlDbType.UByte, true, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("SMALLINT", typeShort, MySqlDbType.Int16, false, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("SMALLINT", typeUshort, MySqlDbType.UInt16, true, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("INT", typeInt, MySqlDbType.Int32, false, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("INT", typeUint, MySqlDbType.UInt32, true, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("MEDIUMINT", typeInt, MySqlDbType.Int24, false, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("MEDIUMINT", typeUint, MySqlDbType.UInt24, true, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("BIGINT", typeLong, MySqlDbType.Int64, false, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("BIGINT", typeUlong, MySqlDbType.UInt64, true, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("BIT", typeUlong, MySqlDbType.Bit, false, false, 0, null, null, 0L));
        DbTypeMapping typeDecimal = AddDbTypeMapping(new DbTypeMapping(typeof(decimal), new DbType[3]
        {
            DbType.Decimal,
            DbType.Currency,
            DbType.VarNumeric
        }, (object o) => Convert.ToDecimal(o)));
        DbTypeMapping typeDouble = AddDbTypeMapping(new DbTypeMapping(typeof(double), new DbType[1]
        {
            DbType.Double
        }, (object o) => Convert.ToDouble(o)));
        DbTypeMapping typeFloat = AddDbTypeMapping(new DbTypeMapping(typeof(float), new DbType[1]
        {
            DbType.Single
        }, (object o) => Convert.ToSingle(o)));

        AddColumnTypeMetadata(new ColumnTypeMetadata("DECIMAL", typeDecimal, MySqlDbType.NewDecimal, false, false, 0, null, "DECIMAL({0},{1});precision,scale", 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("DECIMAL", typeDecimal, MySqlDbType.Decimal, false, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("DOUBLE", typeDouble, MySqlDbType.Double, false, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("FLOAT", typeFloat, MySqlDbType.Float, false, false, 0, null, null, 0L));
        DbTypeMapping typeFixedString = AddDbTypeMapping(new DbTypeMapping(typeof(string), new DbType[2]
        {
            DbType.StringFixedLength,
            DbType.AnsiStringFixedLength
        }, Convert.ToString));
        DbTypeMapping typeString = AddDbTypeMapping(new DbTypeMapping(typeof(string), new DbType[3]
        {
            DbType.String,
            DbType.AnsiString,
            DbType.Xml
        }, Convert.ToString));

        AddColumnTypeMetadata(new ColumnTypeMetadata("VARCHAR", typeString, MySqlDbType.VarChar, false, false, 0, null, "VARCHAR({0});size", 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("VARCHAR", typeString, MySqlDbType.VarString, false, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("CHAR", typeFixedString, MySqlDbType.String, false, false, 0, null, "CHAR({0});size", 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("TINYTEXT", typeString, MySqlDbType.TinyText, false, false, 0, "VARCHAR", null, 255L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("TEXT", typeString, MySqlDbType.Text, false, false, 0, "VARCHAR", null, 65535L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("MEDIUMTEXT", typeString, MySqlDbType.MediumText, false, false, 0, "VARCHAR", null, 16777215L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("LONGTEXT", typeString, MySqlDbType.LongText, false, false, 0, "VARCHAR", null, 4294967295L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("ENUM", typeString, MySqlDbType.Enum, false, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("SET", typeString, MySqlDbType.Set, false, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("JSON", typeString, MySqlDbType.JSON, false, false, 0, null, null, 0L));
        DbTypeMapping typeBinary = AddDbTypeMapping(new DbTypeMapping(typeof(byte[]), new DbType[1]
        {
            DbType.Binary
        }));

        AddColumnTypeMetadata(new ColumnTypeMetadata("BLOB", typeBinary, MySqlDbType.Blob, false, true, 0, "BLOB", null, 65535L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("BINARY", typeBinary, MySqlDbType.Binary, false, true, 0, "BLOB", "BINARY({0});length", 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("VARBINARY", typeBinary, MySqlDbType.VarBinary, false, true, 0, "BLOB", "VARBINARY({0});length", 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("TINYBLOB", typeBinary, MySqlDbType.TinyBlob, false, true, 0, "BLOB", null, 255L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("MEDIUMBLOB", typeBinary, MySqlDbType.MediumBlob, false, true, 0, "BLOB", null, 16777215L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("LONGBLOB", typeBinary, MySqlDbType.LongBlob, false, true, 0, "BLOB", null, 4294967295L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("GEOMETRY", typeBinary, MySqlDbType.Geometry, false, true, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("POINT", typeBinary, MySqlDbType.Geometry, false, true, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("LINESTRING", typeBinary, MySqlDbType.Geometry, false, true, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("POLYGON", typeBinary, MySqlDbType.Geometry, false, true, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("MULTIPOINT", typeBinary, MySqlDbType.Geometry, false, true, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("MULTILINESTRING", typeBinary, MySqlDbType.Geometry, false, true, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("MULTIPOLYGON", typeBinary, MySqlDbType.Geometry, false, true, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("GEOMETRYCOLLECTION", typeBinary, MySqlDbType.Geometry, false, true, 0, null, null, 0L));
        DbTypeMapping typeDate = AddDbTypeMapping(new DbTypeMapping(typeof(DateTime), new DbType[1]
        {
            DbType.Date
        }));
        DbTypeMapping typeDateTime = AddDbTypeMapping(new DbTypeMapping(typeof(DateTime), new DbType[3]
        {
            DbType.DateTime,
            DbType.DateTime2,
            DbType.DateTimeOffset
        }));

        AddDbTypeMapping(new DbTypeMapping(typeof(DateTimeOffset), new DbType[1]
        {
            DbType.DateTimeOffset
        }));
        DbTypeMapping typeTime = AddDbTypeMapping(new DbTypeMapping(typeof(TimeSpan), new DbType[1]
        {
            DbType.Time
        }));

        AddColumnTypeMetadata(new ColumnTypeMetadata("DATETIME", typeDateTime, MySqlDbType.DateTime, false, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("DATE", typeDate, MySqlDbType.Date, false, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("DATE", typeDate, MySqlDbType.Newdate, false, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("TIME", typeTime, MySqlDbType.Time, false, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("TIMESTAMP", typeDateTime, MySqlDbType.Timestamp, false, false, 0, null, null, 0L));
        AddColumnTypeMetadata(new ColumnTypeMetadata("YEAR", typeInt, MySqlDbType.Year, false, false, 0, null, null, 0L));
        DbTypeMapping typeGuid = AddDbTypeMapping(new DbTypeMapping(typeof(Guid), new DbType[1]
        {
            DbType.Guid
        }, (object o) => Guid.Parse(Convert.ToString(o))));

        AddColumnTypeMetadata(new ColumnTypeMetadata("CHAR", typeGuid, MySqlDbType.Guid, false, false, 36, "CHAR(36)", "CHAR(36)", 0L));
        DbTypeMapping typeNull = AddDbTypeMapping(new DbTypeMapping(typeof(object), new DbType[1]
        {
            DbType.Object
        }, (object o) => null));

        AddColumnTypeMetadata(new ColumnTypeMetadata("NULL", typeNull, MySqlDbType.Null, false, false, 0, null, null, 0L));
    }