//--------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner Microsoft // @backupOwner Microsoft //--------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Diagnostics; using System.Data.Common; using System.Data.Common.Utils; using System.Data.Metadata.Edm; using System.Data.Common.CommandTrees.Internal; using System.Data.Common.CommandTrees.ExpressionBuilder; namespace System.Data.Common.CommandTrees { /// /// Describes a binding for an expression. Conceptually similar to a foreach loop /// in C#. The DbExpression property defines the collection being iterated over, /// while the Var property provides a means to reference the current element /// of the collection during the iteration. DbExpressionBinding is used to describe the set arguments /// to relational expressions such as , /// and . /// /// /// [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Db")] public sealed class DbExpressionBinding { private readonly DbExpression _expr; private readonly DbVariableReferenceExpression _varRef; internal DbExpressionBinding(DbExpression input, DbVariableReferenceExpression varRef) { Debug.Assert(input != null, "DbExpressionBinding input cannot be null"); Debug.Assert(varRef != null, "DbExpressionBinding variable cannot be null"); _expr = input; _varRef = varRef; } /// /// Gets the that defines the input set. /// public DbExpression Expression { get { return _expr; } } /// /// Gets the name assigned to the element variable. /// public string VariableName { get { return _varRef.VariableName; } } /// /// Gets the type metadata of the element variable. /// public TypeUsage VariableType { get { return _varRef.ResultType; } } /// /// Gets the that references the element variable. /// public DbVariableReferenceExpression Variable { get { return _varRef;} } } /// /// Defines the binding for the input set to a . /// In addition to the properties of , DbGroupExpressionBinding /// also provides access to the group element via the variable reference /// and to the group aggregate via the property. /// [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Db")] public sealed class DbGroupExpressionBinding { private /*readonly*/ DbExpression _expr; private readonly DbVariableReferenceExpression _varRef; private readonly DbVariableReferenceExpression _groupVarRef; private DbGroupAggregate _groupAggregate; internal DbGroupExpressionBinding(DbExpression input, DbVariableReferenceExpression inputRef, DbVariableReferenceExpression groupRef) { _expr = input; _varRef = inputRef; _groupVarRef = groupRef; } /// /// Gets the that defines the input set. /// public DbExpression Expression { get { return _expr; } } /// /// Gets the name assigned to the element variable. /// public string VariableName { get { return _varRef.VariableName; } } /// /// Gets the type metadata of the element variable. /// public TypeUsage VariableType { get { return _varRef.ResultType; } } /// /// Gets the DbVariableReferenceExpression that references the element variable. /// public DbVariableReferenceExpression Variable { get { return _varRef; } } /// /// Gets the name assigned to the group element variable. /// public string GroupVariableName { get { return _groupVarRef.VariableName; } } /// /// Gets the type metadata of the group element variable. /// public TypeUsage GroupVariableType { get { return _groupVarRef.ResultType; } } /// /// Gets the DbVariableReferenceExpression that references the group element variable. /// public DbVariableReferenceExpression GroupVariable { get { return _groupVarRef; } } /// /// Gets the DbGroupAggregate that represents the collection of elements of the group. /// public DbGroupAggregate GroupAggregate { get { if (_groupAggregate == null) { _groupAggregate = DbExpressionBuilder.GroupAggregate(this.GroupVariable); } return _groupAggregate; } } } }