1 //------------------------------------------------------------------------------
2 // <copyright file="RecordStateScratchpad.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">Microsoft</owner>
6 //------------------------------------------------------------------------------
8 using System.Collections.Generic;
9 using System.Data.Metadata.Edm;
11 using System.Linq.Expressions;
12 using System.Runtime.CompilerServices;
14 namespace System.Data.Common.Internal.Materialization
17 /// Used in the Translator to aggregate information about a (nested) record
18 /// state. After the translator visits the columnMaps, it will compile
19 /// the recordState(s) which produces an immutable RecordStateFactory that
20 /// can be shared amongst many query instances.
22 internal class RecordStateScratchpad
24 private int _stateSlotNumber;
25 internal int StateSlotNumber
27 get { return _stateSlotNumber; }
28 set { _stateSlotNumber = value; }
31 private int _columnCount;
32 internal int ColumnCount
34 get { return _columnCount; }
35 set { _columnCount = value; }
38 private DataRecordInfo _dataRecordInfo;
39 internal DataRecordInfo DataRecordInfo
41 get { return _dataRecordInfo; }
42 set { _dataRecordInfo = value; }
45 private Expression _gatherData;
46 internal Expression GatherData
48 get { return _gatherData; }
49 set { _gatherData = value; }
52 private string[] _propertyNames;
53 internal string[] PropertyNames
55 get { return _propertyNames; }
56 set { _propertyNames = value; }
58 private TypeUsage[] _typeUsages;
59 internal TypeUsage[] TypeUsages
61 get { return _typeUsages; }
62 set { _typeUsages = value; }
65 private List<RecordStateScratchpad> _nestedRecordStateScratchpads = new List<RecordStateScratchpad>();
67 [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
68 internal RecordStateFactory Compile()
70 RecordStateFactory[] nestedRecordStateFactories = new RecordStateFactory[_nestedRecordStateScratchpads.Count];
71 for (int i = 0; i < nestedRecordStateFactories.Length; i++)
73 nestedRecordStateFactories[i] = _nestedRecordStateScratchpads[i].Compile();
76 RecordStateFactory result = (RecordStateFactory)Activator.CreateInstance(typeof(RecordStateFactory), new object[] {
79 nestedRecordStateFactories,