using Ant.DbExpressions; using System; using Ant.Utility; using Ant.Descriptors; using Ant.ORM; namespace Ant.Query.QueryState { internal sealed class RootQueryState : QueryStateBase { Type _elementType; public RootQueryState(Type elementType) : base(CreateResultElement(elementType)) { this._elementType = elementType; } public override FromQueryResult ToFromQueryResult() { if (this.Result.Condition == null) { FromQueryResult result = new FromQueryResult(); result.FromTable = this.Result.FromTable; result.MappingObjectExpression = this.Result.MappingObjectExpression; return result; } return base.ToFromQueryResult(); } /// /// 创建结果元素 /// /// /// static ResultElement CreateResultElement(Type type) { //TODO init _resultElement ResultElement resultElement = new ResultElement(); MetaData typeDescriptor = new MetaData(); typeDescriptor.FiledMeta = MetaDataManager.GetMetaData(type);//获取实体元素 string alias = resultElement.GenerateUniqueTableAlias(typeDescriptor.FiledMeta.Table.Name); resultElement.FromTable = CreateRootTable(typeDescriptor.FiledMeta.Table, alias); MappingObjectExpression moe = new MappingObjectExpression(typeDescriptor.FiledMeta.EntityType.GetConstructor(Type.EmptyTypes)); DbTableSegment tableExp = resultElement.FromTable.Table; DbTable table = new DbTable(alias); foreach (var item in typeDescriptor.FiledMeta.MemberColumnMap)//遍历实体的所有元素 { moe.AddMemberExpression(item.Key, item.Value); if (item.Key.Name.ToLower() == typeDescriptor.FiledMeta.PrimaryKey.Column.Name.ToLower()) moe.PrimaryKey = item.Value; } resultElement.MappingObjectExpression = moe; return resultElement; } /// /// /// /// /// /// static DbFromTableExpression CreateRootTable(DbTable table, string alias) { DbTableExpression tableExp = new DbTableExpression(table); DbTableSegment tableSeg = new DbTableSegment(tableExp, alias); var fromTableExp = new DbFromTableExpression(tableSeg); return fromTableExp; } } }