예제 #1
0
        internal override DbExpression AsCqt(bool isTopLevel)
        {
            CqlBlock      child1       = this.Children[0];
            DbExpression  dbExpression = child1.AsCqt(false);
            List <string> stringList   = new List <string>();

            for (int index = 1; index < this.Children.Count; ++index)
            {
                CqlBlock     child2 = this.Children[index];
                DbExpression right  = child2.AsCqt(false);
                Func <DbExpression, DbExpression, DbExpression> joinCondition = new Func <DbExpression, DbExpression, DbExpression>(this.m_onClauses[index - 1].AsCqt);
                DbJoinExpression dbJoinExpression;
                switch (this.m_opType)
                {
                case CellTreeOpType.FOJ:
                    dbJoinExpression = dbExpression.FullOuterJoin(right, joinCondition);
                    break;

                case CellTreeOpType.LOJ:
                    dbJoinExpression = dbExpression.LeftOuterJoin(right, joinCondition);
                    break;

                case CellTreeOpType.IJ:
                    dbJoinExpression = dbExpression.InnerJoin(right, joinCondition);
                    break;

                default:
                    return((DbExpression)null);
                }
                if (index == 1)
                {
                    child1.SetJoinTreeContext((IList <string>)stringList, dbJoinExpression.Left.VariableName);
                }
                else
                {
                    stringList.Add(dbJoinExpression.Left.VariableName);
                }
                child2.SetJoinTreeContext((IList <string>)stringList, dbJoinExpression.Right.VariableName);
                dbExpression = (DbExpression)dbJoinExpression;
            }
            return((DbExpression)dbExpression.Select <DbExpression>((Func <DbExpression, DbExpression>)(row => this.GenerateProjectionCqt(row, false))));
        }