Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / xsp / System / DynamicData / DynamicData / ModelProviders / DLinqTableProvider.cs / 1305376 / DLinqTableProvider.cs
using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data.Linq.Mapping; using System.Linq; using System.Linq.Expressions; using System.Reflection; namespace System.Web.DynamicData.ModelProviders { internal sealed class DLinqTableProvider : TableProvider { private ReadOnlyCollection_roColumns; private List _columns; private MetaType _rowType; private PropertyInfo _prop; public DLinqTableProvider(DLinqDataModelProvider dataModel, MetaType rowType, string name, PropertyInfo prop) : base(dataModel) { _prop = prop; _rowType = rowType; Name = name; DataContextPropertyName = prop.Name; EntityType = rowType.Type; ParentEntityType = rowType.InheritanceBase != null ? rowType.InheritanceBase.Type : null; RootEntityType = rowType.Table.RowType.Type; _columns = new List (); var members = new List (rowType.DataMembers); // Add in base-class-first order (not the typical derived-class-first order) foreach (PropertyInfo propInfo in GetOrderedProperties(rowType.Type)) { MetaDataMember member = members.FirstOrDefault(m => m.Member.Name == propInfo.Name); if (member != null) { AddColumn(dataModel, member, propInfo); members.Remove(member); } } // Anything we might've missed, tack it onto the end foreach (MetaDataMember member in members) { AddColumn(dataModel, member, (PropertyInfo)member.Member); } _roColumns = new ReadOnlyCollection (_columns); } private void AddColumn(DLinqDataModelProvider dataModel, MetaDataMember member, PropertyInfo propInfo) { var publicGetAccessor = propInfo.GetGetMethod(); if (publicGetAccessor == null) { // the property at least needs to have a public getter, otherwise databinding will not work return; } DLinqColumnProvider column = new DLinqColumnProvider(this, member); _columns.Add(column); if (!dataModel.ColumnLookup.ContainsKey(propInfo)) dataModel.ColumnLookup[propInfo] = column; } private IEnumerable GetOrderedProperties(Type type) { if (type == null) return new PropertyInfo[0]; PropertyInfo[] props = type.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance); return GetOrderedProperties(type.BaseType).Concat(props); } internal void Initialize() { _columns.ForEach(c => ((DLinqColumnProvider)c).Initialize()); _columns.RemoveAll(c => ((DLinqColumnProvider)c).ShouldRemove); } #region IEntity Members public override IQueryable GetQuery(object context) { return (IQueryable)_prop.GetValue(context, null); } public override ReadOnlyCollection Columns { get { return _roColumns; } } #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.Collections.ObjectModel; using System.Data.Linq.Mapping; using System.Linq; using System.Linq.Expressions; using System.Reflection; namespace System.Web.DynamicData.ModelProviders { internal sealed class DLinqTableProvider : TableProvider { private ReadOnlyCollection _roColumns; private List _columns; private MetaType _rowType; private PropertyInfo _prop; public DLinqTableProvider(DLinqDataModelProvider dataModel, MetaType rowType, string name, PropertyInfo prop) : base(dataModel) { _prop = prop; _rowType = rowType; Name = name; DataContextPropertyName = prop.Name; EntityType = rowType.Type; ParentEntityType = rowType.InheritanceBase != null ? rowType.InheritanceBase.Type : null; RootEntityType = rowType.Table.RowType.Type; _columns = new List (); var members = new List (rowType.DataMembers); // Add in base-class-first order (not the typical derived-class-first order) foreach (PropertyInfo propInfo in GetOrderedProperties(rowType.Type)) { MetaDataMember member = members.FirstOrDefault(m => m.Member.Name == propInfo.Name); if (member != null) { AddColumn(dataModel, member, propInfo); members.Remove(member); } } // Anything we might've missed, tack it onto the end foreach (MetaDataMember member in members) { AddColumn(dataModel, member, (PropertyInfo)member.Member); } _roColumns = new ReadOnlyCollection (_columns); } private void AddColumn(DLinqDataModelProvider dataModel, MetaDataMember member, PropertyInfo propInfo) { var publicGetAccessor = propInfo.GetGetMethod(); if (publicGetAccessor == null) { // the property at least needs to have a public getter, otherwise databinding will not work return; } DLinqColumnProvider column = new DLinqColumnProvider(this, member); _columns.Add(column); if (!dataModel.ColumnLookup.ContainsKey(propInfo)) dataModel.ColumnLookup[propInfo] = column; } private IEnumerable GetOrderedProperties(Type type) { if (type == null) return new PropertyInfo[0]; PropertyInfo[] props = type.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance); return GetOrderedProperties(type.BaseType).Concat(props); } internal void Initialize() { _columns.ForEach(c => ((DLinqColumnProvider)c).Initialize()); _columns.RemoveAll(c => ((DLinqColumnProvider)c).ShouldRemove); } #region IEntity Members public override IQueryable GetQuery(object context) { return (IQueryable)_prop.GetValue(context, null); } public override ReadOnlyCollection Columns { get { return _roColumns; } } #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- CompositeDuplexElement.cs
- Input.cs
- WebZoneDesigner.cs
- InfoCardKeyedHashAlgorithm.cs
- MessagePartDescriptionCollection.cs
- Overlapped.cs
- StatusBarPanelClickEvent.cs
- TemplatePropertyEntry.cs
- EntityDataSourceReferenceGroup.cs
- DoubleCollectionValueSerializer.cs
- SHA512Managed.cs
- PointCollectionValueSerializer.cs
- RtType.cs
- KeyboardNavigation.cs
- HMACRIPEMD160.cs
- CombinedGeometry.cs
- FixedPage.cs
- DynamicPhysicalDiscoSearcher.cs
- CngProperty.cs
- mil_commands.cs
- XmlSchemaChoice.cs
- OracleParameterCollection.cs
- DiscoveryServiceExtension.cs
- TickBar.cs
- ToolStripAdornerWindowService.cs
- RtfFormatStack.cs
- XmlTypeAttribute.cs
- WindowsButton.cs
- SerializableAttribute.cs
- FlagsAttribute.cs
- DnsPermission.cs
- XmlNamespaceMapping.cs
- ContainsSearchOperator.cs
- SystemUnicastIPAddressInformation.cs
- SharedPersonalizationStateInfo.cs
- ListViewUpdateEventArgs.cs
- SimpleTextLine.cs
- AspCompat.cs
- SingleSelectRootGridEntry.cs
- DetailsViewDeletedEventArgs.cs
- PointHitTestResult.cs
- DataKeyArray.cs
- RenderDataDrawingContext.cs
- TextSpan.cs
- SiteMapNode.cs
- PropertyTabChangedEvent.cs
- DictionaryKeyPropertyAttribute.cs
- DeviceContexts.cs
- Compiler.cs
- RenamedEventArgs.cs
- ConvertEvent.cs
- FactoryGenerator.cs
- TrustManager.cs
- ObjectStorage.cs
- AsyncOperationManager.cs
- DataGridViewCellMouseEventArgs.cs
- XhtmlConformanceSection.cs
- StateDesignerConnector.cs
- OdbcConnectionPoolProviderInfo.cs
- HwndAppCommandInputProvider.cs
- RightsManagementProvider.cs
- CounterCreationData.cs
- CriticalHandle.cs
- SafeBitVector32.cs
- WebPartDisplayModeCancelEventArgs.cs
- Font.cs
- TableChangeProcessor.cs
- NativeMethods.cs
- XmlSchema.cs
- BindingNavigator.cs
- CallbackHandler.cs
- ExecutionTracker.cs
- Int64KeyFrameCollection.cs
- AssemblyInfo.cs
- DataServiceProcessingPipelineEventArgs.cs
- LicenseProviderAttribute.cs
- ToolStripDropDownMenu.cs
- RadioButtonFlatAdapter.cs
- Section.cs
- Config.cs
- CfgParser.cs
- AlgoModule.cs
- AsyncCompletedEventArgs.cs
- ConfigurationStrings.cs
- CatalogPartCollection.cs
- SpoolingTask.cs
- ObjectItemCollectionAssemblyCacheEntry.cs
- TileBrush.cs
- XamlSerializerUtil.cs
- CutCopyPasteHelper.cs
- GridView.cs
- RayHitTestParameters.cs
- EndOfStreamException.cs
- FolderBrowserDialog.cs
- SubstitutionList.cs
- ObfuscateAssemblyAttribute.cs
- MessageSmuggler.cs
- EtwTrace.cs
- WebPartTracker.cs
- EntityParameterCollection.cs