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); }
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); }
protected virtual void VisitGroupExpressionBindingPre(DbGroupExpressionBinding binding) { if (binding == null) throw new ArgumentException("binding"); VisitExpression(binding.Expression); }
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(')'); }
// 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); }
/// <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) { }
/// <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); }