public override DbExpression Visit(DbGroupByExpression expression)
        {
            EntityUtil.CheckArgumentNull(expression, "expression");

            DbExpression result = expression;

            DbGroupExpressionBinding newInput = this.VisitGroupExpressionBinding(expression.Input);

            this.EnterScope(newInput.Variable);
            IList <DbExpression> newKeys = this.VisitExpressionList(expression.Keys);

            this.ExitScope();
            this.EnterScope(newInput.GroupVariable);
            IList <DbAggregate> newAggs = this.VisitList <DbAggregate>(expression.Aggregates, this.VisitAggregate);

            this.ExitScope();

            if (!object.ReferenceEquals(expression.Input, newInput) ||
                !object.ReferenceEquals(expression.Keys, newKeys) ||
                !object.ReferenceEquals(expression.Aggregates, newAggs))
            {
                RowType 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);
        }
Пример #2
0
        internal DbGroupByExpression(TypeUsage collectionOfRowResultType,
                                     DbGroupExpressionBinding input,
                                     DbExpressionList groupKeys,
                                     System.Collections.ObjectModel.ReadOnlyCollection <DbAggregate> aggregates)
            : base(DbExpressionKind.GroupBy, collectionOfRowResultType)
        {
            Debug.Assert(input != null, "DbGroupExpression input cannot be null");
            Debug.Assert(groupKeys != null, "DbGroupExpression keys cannot be null");
            Debug.Assert(aggregates != null, "DbGroupExpression aggregates cannot be null");
            Debug.Assert(groupKeys.Count > 0 || aggregates.Count > 0, "At least one key or aggregate is required");

            _input      = input;
            _keys       = groupKeys;
            _aggregates = aggregates;
        }
        protected virtual DbGroupExpressionBinding VisitGroupExpressionBinding(DbGroupExpressionBinding binding)
        {
            DbGroupExpressionBinding result = binding;

            if (binding != null)
            {
                DbExpression newInput = this.VisitExpression(binding.Expression);
                if (!object.ReferenceEquals(binding.Expression, newInput))
                {
                    result = CqtBuilder.GroupBindAs(newInput, binding.VariableName, binding.GroupVariableName);
                    this.RebindVariable(binding.Variable, result.Variable);
                    this.RebindVariable(binding.GroupVariable, result.GroupVariable);
                }
            }
            return(result);
        }
Пример #4
0
 protected virtual void VisitGroupExpressionBindingPre(DbGroupExpressionBinding binding)
 {
   if (binding == null) throw new ArgumentException("binding");
   VisitExpression(binding.Expression);
 }
Пример #5
0
 protected virtual void VisitGroupExpressionBindingPost(DbGroupExpressionBinding binding)
 {
 }
 /// <summary>
 /// Convenience method to visit the specified <see cref="DbGroupExpressionBinding"/>.
 /// </summary>
 /// <param name="binding">The DbGroupExpressionBinding to visit.</param>
 /// <exception cref="ArgumentNullException"><paramref name="binding"/> is null</exception>
 protected virtual void VisitGroupExpressionBindingPre(DbGroupExpressionBinding binding)
 {
     ADP1.CheckArgumentNull(binding, "binding");
     VisitExpression(binding.Expression);
 }
 /// <summary>
 /// Dumps a DbGroupExpressionBinding including its VariableName, GroupVariableName and DbExpression
 /// </summary>
 /// <param name="binding">The DbGroupExpressionBinding to dump</param>
 internal void Dump(DbGroupExpressionBinding binding)
 {
     Begin("DbGroupExpressionBinding", "VariableName", binding.VariableName, "GroupVariableName", binding.GroupVariableName);
     Begin("Expression");
     Dump(binding.Expression);
     End("Expression");
     End("DbGroupExpressionBinding");
 }
 /// <summary>
 /// Dumps a DbGroupExpressionBinding with the specified decoration
 /// </summary>
 /// <param name="binding">The DbGroupExpressionBinding to dump</param>
 /// <param name="name">The decorating block name</param>
 internal void Dump(DbGroupExpressionBinding binding, string name)
 {
     Begin(name);
     Dump(binding);
     End(name);
 }
 private void VisitGroupBinding(DbGroupExpressionBinding groupBinding)
 {
     _key.Append("GBVV");
     VisitVariableName(groupBinding.VariableName);
     _key.Append(",");
     VisitVariableName(groupBinding.GroupVariableName);
     _key.Append("=(");
     groupBinding.Expression.Accept(this);
     _key.Append(')');
 }
Пример #10
0
        // Utility translator method for lambda expressions that are part of group by. Given a lambda expression and its translated
        // inputs, translates the lambda expression, assuming the input needs to be used as a grouping input
        private DbExpression TranslateLambda(LambdaExpression lambda, DbExpression input, out DbGroupExpressionBinding binding)
        {
            input = NormalizeSetSource(input);

            // create binding context for this lambda expression
            string alias = _aliasGenerator.Next();
            binding = input.GroupBindAs(alias, string.Format(CultureInfo.InvariantCulture, "Group{0}", alias));

            return TranslateLambda(lambda, binding.Variable);
        }
Пример #11
0
 /// <summary>
 /// Convenience method for post-processing after a DbGroupExpressionBinding has been visited.
 /// </summary>
 /// <param name="binding">The previously visited DbGroupExpressionBinding.</param>
 protected virtual void VisitGroupExpressionBindingPost(DbGroupExpressionBinding binding)
 {
 }
Пример #12
0
 /// <summary>
 /// Convenience method to visit the specified <see cref="DbGroupExpressionBinding"/>.
 /// </summary>
 /// <param name="binding">The DbGroupExpressionBinding to visit.</param>
 /// <exception cref="ArgumentNullException"><paramref name="binding"/> is null</exception>
 protected virtual void VisitGroupExpressionBindingPre(DbGroupExpressionBinding binding)
 {
     EntityUtil.CheckArgumentNull(binding, "binding");
     VisitExpression(binding.Expression);
 }
 /// <summary>
 /// Convenience method to visit the specified <see cref="DbGroupExpressionBinding"/>.
 /// </summary>
 /// <param name="binding">The DbGroupExpressionBinding to visit.</param>
 /// <exception cref="ArgumentNullException"><paramref name="binding"/> is null</exception>
 protected virtual void VisitGroupExpressionBindingPre(DbGroupExpressionBinding binding)
 {
     //Contract.Requires(binding != null);
     VisitExpression(binding.Expression);
 }