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); } }
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; }
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); }
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); }
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()]); } }
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); }
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)); }