public override DbExpression Visit(DbGroupByExpression expression) { Check.NotNull(expression, "expression"); DbExpression result = expression; var newInput = VisitGroupExpressionBinding(expression.Input); EnterScope(newInput.Variable); var newKeys = VisitExpressionList(expression.Keys); ExitScope(); EnterScope(newInput.GroupVariable); var newAggs = VisitList(expression.Aggregates, VisitAggregate); ExitScope(); if (!ReferenceEquals(expression.Input, newInput) || !ReferenceEquals(expression.Keys, newKeys) || !ReferenceEquals(expression.Aggregates, newAggs)) { var groupOutput = TypeHelpers.GetEdmType <RowType>(TypeHelpers.GetEdmType <CollectionType>(expression.ResultType).TypeUsage); var boundKeys = groupOutput.Properties.Take(newKeys.Count).Select(p => p.Name).Zip(newKeys).ToList(); var boundAggs = groupOutput.Properties.Skip(newKeys.Count).Select(p => p.Name).Zip(newAggs).ToList(); result = CqtBuilder.GroupBy(newInput, boundKeys, boundAggs); } NotifyIfChanged(expression, result); return(result); }