static ResultElement CreateResultElement(Type type) { //TODO init _resultElement ResultElement resultElement = new ResultElement(); TypeDescriptor typeDescriptor = TypeDescriptor.GetDescriptor(type); string alias = resultElement.GenerateUniqueTableAlias(typeDescriptor.Table.Name); resultElement.FromTable = CreateRootTable(typeDescriptor.Table, alias); MappingObjectExpression moe = new MappingObjectExpression(typeDescriptor.EntityType.GetConstructor(Type.EmptyTypes)); DbTableSegment tableExp = resultElement.FromTable.Table; DbTable table = new DbTable(alias); foreach (MappingMemberDescriptor item in typeDescriptor.MappingMemberDescriptors.Values) { DbColumnAccessExpression columnAccessExpression = new DbColumnAccessExpression(table, item.Column); moe.AddMemberExpression(item.MemberInfo, columnAccessExpression); if (item.IsPrimaryKey) { moe.PrimaryKey = columnAccessExpression; } } resultElement.MappingObjectExpression = moe; return(resultElement); }
static ResultElement CreateResultElement(Type type, string explicitTableName) { if (type.IsAbstract || type.IsInterface) { throw new ArgumentException("The type of input can not be abstract class or interface."); } //TODO init _resultElement ResultElement resultElement = new ResultElement(); TypeDescriptor typeDescriptor = TypeDescriptor.GetDescriptor(type); DbTable dbTable = typeDescriptor.Table; if (explicitTableName != null) { dbTable = new DbTable(explicitTableName, dbTable.Schema); } string alias = resultElement.GenerateUniqueTableAlias(dbTable.Name); resultElement.FromTable = CreateRootTable(dbTable, alias); ConstructorInfo constructor = typeDescriptor.EntityType.GetConstructor(Type.EmptyTypes); if (constructor == null) { throw new ArgumentException(string.Format("The type of '{0}' does't define a none parameter constructor.", type.FullName)); } MappingObjectExpression moe = new MappingObjectExpression(constructor); DbTableSegment tableExp = resultElement.FromTable.Table; DbTable table = new DbTable(alias); foreach (MappingMemberDescriptor item in typeDescriptor.MappingMemberDescriptors.Values) { DbColumnAccessExpression columnAccessExpression = new DbColumnAccessExpression(table, item.Column); moe.AddMappingMemberExpression(item.MemberInfo, columnAccessExpression); if (item.IsPrimaryKey) { moe.PrimaryKey = columnAccessExpression; } } resultElement.MappingObjectExpression = moe; return(resultElement); }
public override JoinQueryResult Visit(RootQueryExpression exp) { Type type = exp.ElementType; TypeDescriptor typeDescriptor = TypeDescriptor.GetDescriptor(type); string explicitTableName = exp.ExplicitTable; DbTable dbTable = typeDescriptor.Table; if (explicitTableName != null) { dbTable = new DbTable(explicitTableName, dbTable.Schema); } string alias = this._resultElement.GenerateUniqueTableAlias(dbTable.Name); DbTableSegment tableSeg = CreateTableExpression(dbTable, alias); MappingObjectExpression moe = new MappingObjectExpression(typeDescriptor.EntityType.GetConstructor(Type.EmptyTypes)); DbTable table = new DbTable(alias); foreach (MappingMemberDescriptor item in typeDescriptor.MappingMemberDescriptors.Values) { DbColumnAccessExpression columnAccessExpression = new DbColumnAccessExpression(table, item.Column); moe.AddMemberExpression(item.MemberInfo, columnAccessExpression); if (item.IsPrimaryKey) { moe.PrimaryKey = columnAccessExpression; } } //TODO 解析 on 条件表达式 DbExpression condition = null; List <IMappingObjectExpression> moeList = new List <IMappingObjectExpression>(this._moeList.Count + 1); moeList.AddRange(this._moeList); moeList.Add(moe); condition = GeneralExpressionVisitor.ParseLambda(this._conditionExpression, moeList); DbJoinTableExpression joinTable = new DbJoinTableExpression(this._joinType, tableSeg, condition); JoinQueryResult result = new JoinQueryResult(); result.MappingObjectExpression = moe; result.JoinTable = joinTable; return(result); }
public override JoinQueryResult Visit(RootQueryExpression exp) { Type type = exp.ElementType; TypeDescriptor typeDescriptor = EntityTypeContainer.GetDescriptor(type); string explicitTableName = exp.ExplicitTable; DbTable dbTable = typeDescriptor.Table; if (explicitTableName != null) { dbTable = new DbTable(explicitTableName, dbTable.Schema); } string alias = this._resultElement.GenerateUniqueTableAlias(dbTable.Name); DbTableSegment tableSeg = CreateTableSegment(dbTable, alias, exp.Lock); MappingObjectExpression moe = new MappingObjectExpression(typeDescriptor.Definition.Type.GetConstructor(Type.EmptyTypes)); DbTable table = new DbTable(alias); foreach (PropertyDescriptor item in typeDescriptor.PropertyDescriptors) { DbColumnAccessExpression columnAccessExpression = new DbColumnAccessExpression(table, item.Column); moe.AddMappingMemberExpression(item.Property, columnAccessExpression); if (item.IsPrimaryKey) { moe.PrimaryKey = columnAccessExpression; } } //TODO 解析 on 条件表达式 var scopeParameters = this._scopeParameters.Clone(this._conditionExpression.Parameters.Last(), moe); DbExpression condition = GeneralExpressionParser.Parse(this._conditionExpression, scopeParameters, this._resultElement.ScopeTables); DbJoinTableExpression joinTable = new DbJoinTableExpression(this._joinType.AsDbJoinType(), tableSeg, condition); JoinQueryResult result = new JoinQueryResult(); result.MappingObjectExpression = moe; result.JoinTable = joinTable; return(result); }
protected override IMappingObjectExpression VisitNew(NewExpression exp) { IMappingObjectExpression result = new MappingObjectExpression(exp.Constructor); ParameterInfo[] parames = exp.Constructor.GetParameters(); for (int i = 0; i < parames.Length; i++) { ParameterInfo pi = parames[i]; Expression argExp = exp.Arguments[i]; if (MappingTypeSystem.IsMappingType(pi.ParameterType)) { DbExpression dbExpression = this.ResolveExpression(argExp); result.AddMappingConstructorParameter(pi, dbExpression); } else { IMappingObjectExpression subResult = this.Visit(argExp); result.AddComplexConstructorParameter(pi, subResult); } } return(result); }