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;
}
}
}