Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DataEntity / System / Data / Common / internal / materialization / recordstatefactory.cs / 1 / recordstatefactory.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
//-----------------------------------------------------------------------------
using System.Collections.Generic;
using System.Data.Metadata.Edm;
using System.Linq;
using System.Linq.Expressions;
namespace System.Data.Common.Internal.Materialization
{
///
/// An immutable class used to generate new RecordStates, which are used
/// at runtime to produce value-layer (aka DataReader) results.
///
/// Contains static information collected by the Translator visitor. The
/// expressions produced by the Translator are compiled. The RecordStates
/// will refer to this object for all static information.
///
/// This class is cached in the query cache as part of the CoordinatorFactory.
///
internal class RecordStateFactory
{
#region state
///
/// Indicates which state slot in the Shaper.State is expected to hold the
/// value for this record state. Each unique record shape has it's own state
/// slot.
///
internal readonly int StateSlotNumber;
///
/// How many column values we have to reserve space for in this record.
///
internal readonly int ColumnCount;
///
/// The DataRecordInfo we must return for this record. If the record represents
/// an entity, this will be used to construct a unique EntityRecordInfo with the
/// EntityKey and EntitySet for the entity.
///
internal readonly DataRecordInfo DataRecordInfo;
///
/// A function that will gather the data for the row and store it on the record state.
///
internal readonly Func GatherData;
///
/// Collection of nested records for this record, such as a complex type that is
/// part of an entity. This does not include records that are part of a nested
/// collection, however.
///
internal readonly System.Collections.ObjectModel.ReadOnlyCollection NestedRecordStateFactories;
///
/// The name for each column.
///
internal readonly System.Collections.ObjectModel.ReadOnlyCollection ColumnNames;
///
/// The type usage information for each column.
///
internal readonly System.Collections.ObjectModel.ReadOnlyCollection TypeUsages;
///
/// Tracks which columns might need special handling (nested readers/records)
///
internal readonly System.Collections.ObjectModel.ReadOnlyCollection IsColumnNested;
///
/// Tracks whether there are ANY columns that need special handling.
///
internal readonly bool HasNestedColumns;
///
/// A helper class to make the translation from name->ordinal.
///
internal readonly FieldNameLookup FieldNameLookup;
///
/// Description of this RecordStateFactory, used for debugging only; while this
/// is not needed in retail code, it is pretty important because it's the only
/// description we'll have once we compile the Expressions; debugging a problem
/// with retail bits would be pretty hard without this.
///
private readonly string Description;
#endregion
#region constructor
public RecordStateFactory(int stateSlotNumber, int columnCount, RecordStateFactory[] nestedRecordStateFactories, DataRecordInfo dataRecordInfo, Expression gatherData, string[] propertyNames, TypeUsage[] typeUsages)
{
this.StateSlotNumber = stateSlotNumber;
this.ColumnCount = columnCount;
this.NestedRecordStateFactories = new System.Collections.ObjectModel.ReadOnlyCollection(nestedRecordStateFactories);
this.DataRecordInfo = dataRecordInfo;
this.GatherData = Translator.Compile(gatherData);
this.Description = gatherData.ToString();
this.ColumnNames = new System.Collections.ObjectModel.ReadOnlyCollection(propertyNames);
this.TypeUsages = new System.Collections.ObjectModel.ReadOnlyCollection(typeUsages);
this.FieldNameLookup = new FieldNameLookup(this.ColumnNames, -1);
// pre-compute the nested objects from typeUsage, for performance
bool[] isColumnNested = new bool[columnCount];
for (int ordinal = 0; ordinal < columnCount; ordinal++)
{
switch (typeUsages[ordinal].EdmType.BuiltInTypeKind)
{
case BuiltInTypeKind.EntityType:
case BuiltInTypeKind.ComplexType:
case BuiltInTypeKind.RowType:
case BuiltInTypeKind.CollectionType:
isColumnNested[ordinal] = true;
this.HasNestedColumns = true;
break;
default:
isColumnNested[ordinal] = false;
break;
}
}
this.IsColumnNested = new System.Collections.ObjectModel.ReadOnlyCollection(isColumnNested);
}
#endregion
#region "public" surface area
///
/// It's GO time, create the record state.
///
internal RecordState Create(CoordinatorFactory coordinatorFactory)
{
return new RecordState(this, coordinatorFactory);
}
#endregion
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
//-----------------------------------------------------------------------------
using System.Collections.Generic;
using System.Data.Metadata.Edm;
using System.Linq;
using System.Linq.Expressions;
namespace System.Data.Common.Internal.Materialization
{
///
/// An immutable class used to generate new RecordStates, which are used
/// at runtime to produce value-layer (aka DataReader) results.
///
/// Contains static information collected by the Translator visitor. The
/// expressions produced by the Translator are compiled. The RecordStates
/// will refer to this object for all static information.
///
/// This class is cached in the query cache as part of the CoordinatorFactory.
///
internal class RecordStateFactory
{
#region state
///
/// Indicates which state slot in the Shaper.State is expected to hold the
/// value for this record state. Each unique record shape has it's own state
/// slot.
///
internal readonly int StateSlotNumber;
///
/// How many column values we have to reserve space for in this record.
///
internal readonly int ColumnCount;
///
/// The DataRecordInfo we must return for this record. If the record represents
/// an entity, this will be used to construct a unique EntityRecordInfo with the
/// EntityKey and EntitySet for the entity.
///
internal readonly DataRecordInfo DataRecordInfo;
///
/// A function that will gather the data for the row and store it on the record state.
///
internal readonly Func GatherData;
///
/// Collection of nested records for this record, such as a complex type that is
/// part of an entity. This does not include records that are part of a nested
/// collection, however.
///
internal readonly System.Collections.ObjectModel.ReadOnlyCollection NestedRecordStateFactories;
///
/// The name for each column.
///
internal readonly System.Collections.ObjectModel.ReadOnlyCollection ColumnNames;
///
/// The type usage information for each column.
///
internal readonly System.Collections.ObjectModel.ReadOnlyCollection TypeUsages;
///
/// Tracks which columns might need special handling (nested readers/records)
///
internal readonly System.Collections.ObjectModel.ReadOnlyCollection IsColumnNested;
///
/// Tracks whether there are ANY columns that need special handling.
///
internal readonly bool HasNestedColumns;
///
/// A helper class to make the translation from name->ordinal.
///
internal readonly FieldNameLookup FieldNameLookup;
///
/// Description of this RecordStateFactory, used for debugging only; while this
/// is not needed in retail code, it is pretty important because it's the only
/// description we'll have once we compile the Expressions; debugging a problem
/// with retail bits would be pretty hard without this.
///
private readonly string Description;
#endregion
#region constructor
public RecordStateFactory(int stateSlotNumber, int columnCount, RecordStateFactory[] nestedRecordStateFactories, DataRecordInfo dataRecordInfo, Expression gatherData, string[] propertyNames, TypeUsage[] typeUsages)
{
this.StateSlotNumber = stateSlotNumber;
this.ColumnCount = columnCount;
this.NestedRecordStateFactories = new System.Collections.ObjectModel.ReadOnlyCollection(nestedRecordStateFactories);
this.DataRecordInfo = dataRecordInfo;
this.GatherData = Translator.Compile(gatherData);
this.Description = gatherData.ToString();
this.ColumnNames = new System.Collections.ObjectModel.ReadOnlyCollection(propertyNames);
this.TypeUsages = new System.Collections.ObjectModel.ReadOnlyCollection(typeUsages);
this.FieldNameLookup = new FieldNameLookup(this.ColumnNames, -1);
// pre-compute the nested objects from typeUsage, for performance
bool[] isColumnNested = new bool[columnCount];
for (int ordinal = 0; ordinal < columnCount; ordinal++)
{
switch (typeUsages[ordinal].EdmType.BuiltInTypeKind)
{
case BuiltInTypeKind.EntityType:
case BuiltInTypeKind.ComplexType:
case BuiltInTypeKind.RowType:
case BuiltInTypeKind.CollectionType:
isColumnNested[ordinal] = true;
this.HasNestedColumns = true;
break;
default:
isColumnNested[ordinal] = false;
break;
}
}
this.IsColumnNested = new System.Collections.ObjectModel.ReadOnlyCollection(isColumnNested);
}
#endregion
#region "public" surface area
///
/// It's GO time, create the record state.
///
internal RecordState Create(CoordinatorFactory coordinatorFactory)
{
return new RecordState(this, coordinatorFactory);
}
#endregion
}
}
// 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
- CodeCatchClause.cs
- Win32PrintDialog.cs
- Literal.cs
- RulePatternOps.cs
- PageThemeBuildProvider.cs
- CommandExpr.cs
- XmlWrappingReader.cs
- KeyGesture.cs
- Constants.cs
- WebSysDisplayNameAttribute.cs
- DataSourceHelper.cs
- GlobalizationSection.cs
- PenLineJoinValidation.cs
- SchemaInfo.cs
- Panel.cs
- VectorKeyFrameCollection.cs
- PropertiesTab.cs
- DataRelation.cs
- InputLangChangeEvent.cs
- HitTestFilterBehavior.cs
- OdbcErrorCollection.cs
- Literal.cs
- CallbackException.cs
- QilValidationVisitor.cs
- StrongNamePublicKeyBlob.cs
- SchemaDeclBase.cs
- IPAddressCollection.cs
- HelpInfo.cs
- UnwrappedTypesXmlSerializerManager.cs
- XmlLinkedNode.cs
- TemplateControlCodeDomTreeGenerator.cs
- ElementAction.cs
- GeneratedCodeAttribute.cs
- Pen.cs
- SecondaryIndexDefinition.cs
- LocalizationComments.cs
- CopyNodeSetAction.cs
- ViewValidator.cs
- CreatingCookieEventArgs.cs
- SqlCaseSimplifier.cs
- RightsManagementPermission.cs
- InternalDispatchObject.cs
- ProgressBarHighlightConverter.cs
- CallbackValidatorAttribute.cs
- ClientBuildManagerCallback.cs
- ProtocolsConfiguration.cs
- Merger.cs
- SafeNativeMethods.cs
- MonthCalendar.cs
- RNGCryptoServiceProvider.cs
- StyleModeStack.cs
- HierarchicalDataSourceControl.cs
- SrgsItemList.cs
- CompilerParameters.cs
- MessageDescriptionCollection.cs
- CommandConverter.cs
- LinqDataSourceDisposeEventArgs.cs
- UnionExpr.cs
- ExternalException.cs
- SoapSchemaImporter.cs
- SubtreeProcessor.cs
- AnnotationAdorner.cs
- CultureInfoConverter.cs
- NodeLabelEditEvent.cs
- ValidationResult.cs
- TraceHwndHost.cs
- RtType.cs
- XmlSortKeyAccumulator.cs
- DataGridViewRowsAddedEventArgs.cs
- BitConverter.cs
- CommandManager.cs
- ImportDesigner.xaml.cs
- ExpressionVisitorHelpers.cs
- FileStream.cs
- PeerResolverBindingElement.cs
- DeclaredTypeElement.cs
- InterleavedZipPartStream.cs
- Resources.Designer.cs
- LineUtil.cs
- Win32PrintDialog.cs
- SortDescriptionCollection.cs
- RootBrowserWindowProxy.cs
- HtmlInputSubmit.cs
- MenuItem.cs
- securitycriticaldataClass.cs
- FilterException.cs
- MetadataFile.cs
- FontSizeConverter.cs
- DynamicResourceExtensionConverter.cs
- TraceHandler.cs
- WebPartUtil.cs
- DefaultEvaluationContext.cs
- MessageQueuePermissionEntryCollection.cs
- InfoCardUIAgent.cs
- SamlSerializer.cs
- DescendantOverDescendantQuery.cs
- SystemResourceHost.cs
- TriggerActionCollection.cs
- ReadOnlyHierarchicalDataSource.cs
- _Connection.cs