Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / ndp / fx / src / DataEntity / System / Data / Common / CommandTrees / Aggregates.cs / 1 / Aggregates.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....], [....] //--------------------------------------------------------------------- using System; using System.Data.Common; using System.Collections.Generic; using System.Data.Metadata.Edm; using System.Data.Common.CommandTrees.Internal; using System.Diagnostics; namespace System.Data.Common.CommandTrees { ////// Aggregates are pseudo-expressions. They look and feel like expressions, but /// are severely restricted in where they can appear - only in the aggregates clause /// of a group-by expression. /// [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Db")] public abstract class DbAggregate { private DbCommandTree _commandTree; private ExpressionList _args; private TypeUsage _type; internal DbAggregate(DbCommandTree commandTree) { _commandTree = EntityUtil.CheckArgumentNull(commandTree, "commandTree"); } internal ExpressionList ArgumentList { get { return _args; } set { _args = value; } } ////// The DbCommandTree with which this DbAggregate is associated /// internal DbCommandTree CommandTree { get { return _commandTree; } } ////// Gets the result type of this aggregate /// public TypeUsage ResultType { get { return _type; } internal set { // this is causing null ref //Debug.Assert(_type.IsReadOnlyItem, "Editable type specified as DbAggregate.ResultType"); _type = value; } } ////// Gets the list of expressions that define the arguments to the aggregate. /// public IListArguments { get { return _args; } } } #if ENABLE_NESTAGGREGATE /// /// The aggregate type that corresponds to a nesting operation. /// public sealed class NestAggregate : Aggregate { internal NestAggregate(CommandTree commandTree, Expression arg) : base(commandTree) { if (null == arg) { throw EntityUtil.ArgumentNull("arg"); } this.ArgumentList = new ExpressionList("Arguments", commandTree, arg.ResultType, CommandTreeUtils.CreateList(arg)); this.ResultType = commandTree.TypeHelper.CreateCollectionType(arg.Type); } } #endif /// /// The aggregate type that corresponds to the invocation of an aggregate function. /// [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Db")] public sealed class DbFunctionAggregate : DbAggregate { private bool _distinct; EdmFunction _aggregateFunction; internal DbFunctionAggregate(DbCommandTree commandTree, EdmFunction function, DbExpression arg, bool isDistinct) : base(commandTree) { EntityUtil.CheckArgumentNull(arg, "arg"); _distinct = isDistinct; // // Verify that the aggregate function is from the metadata collection and data space of the command tree. // commandTree.TypeHelper.CheckFunction(function); // Verify that the function is actually a valid aggregate function. // For now, only a single argument is allowed. if (!TypeSemantics.IsAggregateFunction(function) || null == function.ReturnParameter || TypeSemantics.IsNullOrNullType(function.ReturnParameter.TypeUsage)) { throw EntityUtil.Argument(System.Data.Entity.Strings.Cqt_Aggregate_InvalidFunction, "function"); } _aggregateFunction = function; // Create an ExpressionList without initializing the expected element types or element values this.ArgumentList = new ExpressionList("Arguments", commandTree, function.Parameters.Count); ListfuncArgs = CommandTreeUtils.CreateList (arg); // // Set the expected element type for each element in the ExpressionList based on the parameter // type of each formal parameter to the function. For each parameter, if its parameter type is // a collection type then the element type of that collection will be used. Otherwise the parameter // type itself will be used. This is necessary because aggregate functions may be used outside of // GroupBy and therefore always specify their parameter types as collection types. From within // GroupBy the (non-collection) GroupVar may legally be passed to the same aggregate function. // After the expected element type is set, the element value is set. This causes ExpressionLink type // checking and other expression validation to occur against the expected element type that was just set. // Debug.Assert(funcArgs.Count == function.Parameters.Count, "Incorrect number of arguments specified for DbFunctionAggregate"); for (int idx = 0; idx < funcArgs.Count; idx++) { TypeUsage paramType = function.Parameters[idx].TypeUsage; TypeUsage elementType = null; if(TypeHelpers.TryGetCollectionElementType(paramType, out elementType)) { paramType = elementType; } this.ArgumentList.ExpressionLinks[idx].SetExpectedType(paramType); this.ArgumentList.ExpressionLinks[idx].InitializeValue(funcArgs[idx]); } this.ResultType = function.ReturnParameter.TypeUsage; } /// /// Gets a value indicating whether the aggregate function is applied in a distinct fashion /// public bool Distinct { get { return _distinct; } } ////// Gets the method metadata that specifies the aggregate function to invoke. /// public EdmFunction Function { get { return _aggregateFunction; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....], [....] //--------------------------------------------------------------------- using System; using System.Data.Common; using System.Collections.Generic; using System.Data.Metadata.Edm; using System.Data.Common.CommandTrees.Internal; using System.Diagnostics; namespace System.Data.Common.CommandTrees { ////// Aggregates are pseudo-expressions. They look and feel like expressions, but /// are severely restricted in where they can appear - only in the aggregates clause /// of a group-by expression. /// [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Db")] public abstract class DbAggregate { private DbCommandTree _commandTree; private ExpressionList _args; private TypeUsage _type; internal DbAggregate(DbCommandTree commandTree) { _commandTree = EntityUtil.CheckArgumentNull(commandTree, "commandTree"); } internal ExpressionList ArgumentList { get { return _args; } set { _args = value; } } ////// The DbCommandTree with which this DbAggregate is associated /// internal DbCommandTree CommandTree { get { return _commandTree; } } ////// Gets the result type of this aggregate /// public TypeUsage ResultType { get { return _type; } internal set { // this is causing null ref //Debug.Assert(_type.IsReadOnlyItem, "Editable type specified as DbAggregate.ResultType"); _type = value; } } ////// Gets the list of expressions that define the arguments to the aggregate. /// public IListArguments { get { return _args; } } } #if ENABLE_NESTAGGREGATE /// /// The aggregate type that corresponds to a nesting operation. /// public sealed class NestAggregate : Aggregate { internal NestAggregate(CommandTree commandTree, Expression arg) : base(commandTree) { if (null == arg) { throw EntityUtil.ArgumentNull("arg"); } this.ArgumentList = new ExpressionList("Arguments", commandTree, arg.ResultType, CommandTreeUtils.CreateList(arg)); this.ResultType = commandTree.TypeHelper.CreateCollectionType(arg.Type); } } #endif /// /// The aggregate type that corresponds to the invocation of an aggregate function. /// [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Db")] public sealed class DbFunctionAggregate : DbAggregate { private bool _distinct; EdmFunction _aggregateFunction; internal DbFunctionAggregate(DbCommandTree commandTree, EdmFunction function, DbExpression arg, bool isDistinct) : base(commandTree) { EntityUtil.CheckArgumentNull(arg, "arg"); _distinct = isDistinct; // // Verify that the aggregate function is from the metadata collection and data space of the command tree. // commandTree.TypeHelper.CheckFunction(function); // Verify that the function is actually a valid aggregate function. // For now, only a single argument is allowed. if (!TypeSemantics.IsAggregateFunction(function) || null == function.ReturnParameter || TypeSemantics.IsNullOrNullType(function.ReturnParameter.TypeUsage)) { throw EntityUtil.Argument(System.Data.Entity.Strings.Cqt_Aggregate_InvalidFunction, "function"); } _aggregateFunction = function; // Create an ExpressionList without initializing the expected element types or element values this.ArgumentList = new ExpressionList("Arguments", commandTree, function.Parameters.Count); ListfuncArgs = CommandTreeUtils.CreateList (arg); // // Set the expected element type for each element in the ExpressionList based on the parameter // type of each formal parameter to the function. For each parameter, if its parameter type is // a collection type then the element type of that collection will be used. Otherwise the parameter // type itself will be used. This is necessary because aggregate functions may be used outside of // GroupBy and therefore always specify their parameter types as collection types. From within // GroupBy the (non-collection) GroupVar may legally be passed to the same aggregate function. // After the expected element type is set, the element value is set. This causes ExpressionLink type // checking and other expression validation to occur against the expected element type that was just set. // Debug.Assert(funcArgs.Count == function.Parameters.Count, "Incorrect number of arguments specified for DbFunctionAggregate"); for (int idx = 0; idx < funcArgs.Count; idx++) { TypeUsage paramType = function.Parameters[idx].TypeUsage; TypeUsage elementType = null; if(TypeHelpers.TryGetCollectionElementType(paramType, out elementType)) { paramType = elementType; } this.ArgumentList.ExpressionLinks[idx].SetExpectedType(paramType); this.ArgumentList.ExpressionLinks[idx].InitializeValue(funcArgs[idx]); } this.ResultType = function.ReturnParameter.TypeUsage; } /// /// Gets a value indicating whether the aggregate function is applied in a distinct fashion /// public bool Distinct { get { return _distinct; } } ////// Gets the method metadata that specifies the aggregate function to invoke. /// public EdmFunction Function { get { return _aggregateFunction; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- XmlSchemaElement.cs
- BasicViewGenerator.cs
- ServiceHostFactory.cs
- ConfigXmlSignificantWhitespace.cs
- UITypeEditors.cs
- TimeoutTimer.cs
- EntityClientCacheKey.cs
- DataGridViewSelectedCellCollection.cs
- MatrixKeyFrameCollection.cs
- SqlDataSourceCustomCommandPanel.cs
- PropertyDescriptor.cs
- ByteAnimationUsingKeyFrames.cs
- XmlSchemaSimpleContent.cs
- CodeTypeDeclarationCollection.cs
- DataChangedEventManager.cs
- XPathAncestorIterator.cs
- WebPartMovingEventArgs.cs
- RootBrowserWindowProxy.cs
- _FtpDataStream.cs
- ConnectionPoint.cs
- ListViewDeletedEventArgs.cs
- ConfigUtil.cs
- XmlSchemaAttributeGroupRef.cs
- EmbeddedObject.cs
- DbFunctionCommandTree.cs
- SchemaElementLookUpTable.cs
- ResourceBinder.cs
- MailDefinitionBodyFileNameEditor.cs
- ProcessModelInfo.cs
- XpsFilter.cs
- ComplexBindingPropertiesAttribute.cs
- DataGridViewRowHeaderCell.cs
- MultilineStringEditor.cs
- WebFaultClientMessageInspector.cs
- PenContext.cs
- LinqToSqlWrapper.cs
- WinInetCache.cs
- DescriptionAttribute.cs
- AlternationConverter.cs
- EventQueueState.cs
- ApplicationManager.cs
- CommonDialog.cs
- ContactManager.cs
- NullableDoubleSumAggregationOperator.cs
- BevelBitmapEffect.cs
- SimpleApplicationHost.cs
- AutoResetEvent.cs
- NumberFormatter.cs
- ReaderWriterLock.cs
- GridProviderWrapper.cs
- BitmapEffectDrawingContent.cs
- DateTime.cs
- VScrollProperties.cs
- QuotedPrintableStream.cs
- KeyMatchBuilder.cs
- MetaForeignKeyColumn.cs
- ErrorHandler.cs
- COSERVERINFO.cs
- HtmlInputCheckBox.cs
- ToolStripItemClickedEventArgs.cs
- ExternalFile.cs
- DataObject.cs
- ManagedIStream.cs
- EditorServiceContext.cs
- GetPageCompletedEventArgs.cs
- Renderer.cs
- SuppressIldasmAttribute.cs
- Ref.cs
- PreProcessInputEventArgs.cs
- While.cs
- WindowsStatic.cs
- ReferencedAssembly.cs
- ErrorTableItemStyle.cs
- printdlgexmarshaler.cs
- XmlSerializationWriter.cs
- WebSysDefaultValueAttribute.cs
- RegexParser.cs
- GenerateTemporaryTargetAssembly.cs
- DiagnosticSection.cs
- EntityDataSourceColumn.cs
- EmptyStringExpandableObjectConverter.cs
- FilteredReadOnlyMetadataCollection.cs
- ProviderUtil.cs
- TagNameToTypeMapper.cs
- ZoneLinkButton.cs
- PackagePart.cs
- QueryConverter.cs
- ObjectDataSourceFilteringEventArgs.cs
- EventSinkHelperWriter.cs
- AdapterUtil.cs
- PropertyTabChangedEvent.cs
- GlobalizationAssembly.cs
- ConsumerConnectionPoint.cs
- SafeEventLogWriteHandle.cs
- AsymmetricKeyExchangeFormatter.cs
- MappingMetadataHelper.cs
- NameValueFileSectionHandler.cs
- EntityWrapper.cs
- PassportAuthentication.cs
- Version.cs