//---------------------------------------------------------------------
//
// 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;
}
}
}
}