public override JoinQueryResult Visit(RootQueryExpression exp)
        {
            Type           type           = exp.ElementType;
            TypeDescriptor typeDescriptor = TypeDescriptor.GetDescriptor(type);

            string alias = this._resultElement.GenerateUniqueTableAlias(typeDescriptor.Table.Name);

            DbTableSegment          tableSeg = CreateTableExpression(typeDescriptor.Table, alias);
            MappingObjectExpression moe      = new MappingObjectExpression(typeDescriptor.EntityType.GetTypeInfo().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.VisitPredicate(this._conditionExpression, moeList);

            DbJoinTableExpression joinTable = new DbJoinTableExpression(this._joinType, tableSeg, condition);

            JoinQueryResult result = new JoinQueryResult();

            result.MappingObjectExpression = moe;
            result.JoinTable = joinTable;

            return(result);
        }
 public static DbExpression VisitFilterPredicate(LambdaExpression lambda, List <IMappingObjectExpression> moeList)
 {
     return(GeneralExpressionVisitor.VisitPredicate(ExpressionVisitorBase.ReBuildFilterPredicate(lambda), moeList));
 }