public override void Translate(
            MethodCallExpression m, TranslationState state, UniqueNameGenerator nameGenerator)
        {
            var arguments = state.ResultStack.Pop();
            var dbSelect  = (IDbSelect)state.ResultStack.Pop();

            var selections = SqlTranslationHelper.ProcessSelection(arguments, _dbFactory);

            foreach (var selectable in selections)
            {
                SqlTranslationHelper.UpdateJoinType(selectable.Ref);
                dbSelect.Selection.Add(selectable);
            }

            var newSelectRef = _dbFactory.BuildRef(dbSelect);
            var newSelect    = _dbFactory.BuildSelect(newSelectRef);

            newSelectRef.Alias = nameGenerator.GenerateAlias(dbSelect, TranslationConstants.SubSelectPrefix, true);

            selections = selections.Concat(dbSelect.Selection.Where(s => s.IsJoinKey)).ToArray();
            foreach (var selectable in selections)
            {
                var newSelectable = CreateNewSelectableForWrappingSelect(selectable, newSelectRef, _dbFactory);

                newSelect.Selection.Add(newSelectable);
            }

            state.ResultStack.Push(newSelect);
        }
Exemplo n.º 2
0
        public override void Translate(
            MethodCallExpression m, TranslationState state, UniqueNameGenerator nameGenerator)
        {
            // group by can be a column, a expression, or a list of columns / expressions
            var arguments = state.ResultStack.Pop();
            var dbSelect  = (IDbSelect)state.ResultStack.Pop();

            var groupBys = dbSelect.GroupBys;

            groupBys.IsSingleKey = !(arguments is IDbList <DbKeyValue>);

            var selections = SqlTranslationHelper.ProcessSelection(arguments, _dbFactory);

            foreach (var selectable in selections)
            {
                SqlTranslationHelper.UpdateJoinType(selectable.Ref);

                var refCol = selectable as IDbRefColumn;
                // if we group on a ref column, we are actaully group by on the primary key
                // of the entity that ref column referring to. In the refering entity is actually
                // another ref column, then we will need to get the primay key recursive from RefTo
                if (refCol?.RefTo != null)
                {
                    foreach (var pk in refCol.GetPrimaryKeys())
                    {
                        refCol.RefTo.AddToReferedSelect(_dbFactory, pk.Name, pk.ValType);
                    }
                }

                dbSelect.GroupBys.Add(selectable);
            }

            // if the group by is a single expression like groupby(x => x.Children.Count())
            // it will be translated into a expression and will not have alias
            // in this case, we will need to give it an alias which will be used later
            if (groupBys.IsSingleKey)
            {
                var column = groupBys.Single();
                if (column.Alias == null)
                {
                    column.Alias = "Key";
                }
            }

            state.ResultStack.Push(dbSelect);
        }
Exemplo n.º 3
0
        public override void Translate(MethodCallExpression m, TranslationState state, UniqueNameGenerator nameGenerator)
        {
            // group by can be a column, a expression, or a list of columns / expressions
            var arguments = state.ResultStack.Pop();
            var dbSelect  = (IDbSelect)state.ResultStack.Pop();

            var direction = m.Method.Name.EndsWith("Descending") ? DbOrderDirection.Desc : DbOrderDirection.Asc;

            var selections = SqlTranslationHelper.ProcessSelection(arguments, _dbFactory);

            foreach (var selectable in selections)
            {
                SqlTranslationHelper.UpdateJoinType(selectable.Ref);
                var orderByCol = _dbFactory.BuildOrderByColumn(selectable, direction);
                dbSelect.OrderBys.Add(orderByCol);
            }

            state.ResultStack.Push(dbSelect);
        }