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
- StringAnimationUsingKeyFrames.cs
- IsolatedStorageFileStream.cs
- SrgsElement.cs
- PresentationAppDomainManager.cs
- ModuleBuilderData.cs
- ResourceDefaultValueAttribute.cs
- ThicknessAnimation.cs
- Timer.cs
- TogglePattern.cs
- IERequestCache.cs
- CodeAssignStatement.cs
- HttpListenerPrefixCollection.cs
- TimeSpanSecondsConverter.cs
- HandledEventArgs.cs
- EntityDesignerDataSourceView.cs
- UndoManager.cs
- AttributeQuery.cs
- StringAttributeCollection.cs
- MappingItemCollection.cs
- MetadataUtilsSmi.cs
- ReliableInputConnection.cs
- TablePattern.cs
- XmlSchemaProviderAttribute.cs
- IDQuery.cs
- ProfessionalColors.cs
- Rect.cs
- ImageFormat.cs
- StylusPointPropertyUnit.cs
- ErrorHandler.cs
- ContentTextAutomationPeer.cs
- CodeSnippetStatement.cs
- IndexedString.cs
- FixedSOMFixedBlock.cs
- WmlImageAdapter.cs
- MissingSatelliteAssemblyException.cs
- SafeCryptoHandles.cs
- TypeUnloadedException.cs
- PrePostDescendentsWalker.cs
- WebServiceClientProxyGenerator.cs
- TemplateControlParser.cs
- SelectionRangeConverter.cs
- SmiEventSink_Default.cs
- DateTimeValueSerializerContext.cs
- PropertyTabAttribute.cs
- UdpDiscoveryEndpoint.cs
- ScriptMethodAttribute.cs
- FrameDimension.cs
- Source.cs
- SchemaHelper.cs
- DependencyObject.cs
- ChildTable.cs
- WebRequestModuleElementCollection.cs
- LightweightCodeGenerator.cs
- DotExpr.cs
- DesignerAutoFormatCollection.cs
- AuthorizationContext.cs
- SSmlParser.cs
- ListMarkerSourceInfo.cs
- SymLanguageType.cs
- StrokeSerializer.cs
- SqlConnectionFactory.cs
- ResourceManagerWrapper.cs
- Transform3DCollection.cs
- ImageClickEventArgs.cs
- BitHelper.cs
- GregorianCalendar.cs
- WebPartDesigner.cs
- DrawListViewSubItemEventArgs.cs
- PropertyCollection.cs
- _OSSOCK.cs
- AsymmetricKeyExchangeDeformatter.cs
- ConfigurationElementCollection.cs
- MulticastNotSupportedException.cs
- DataObjectCopyingEventArgs.cs
- ExtensionQuery.cs
- ProgressBarRenderer.cs
- PropertyValue.cs
- CompiledAction.cs
- ObjectDataProvider.cs
- HttpRequestCacheValidator.cs
- EtwProvider.cs
- FormViewDeleteEventArgs.cs
- TextTreeRootTextBlock.cs
- FtpCachePolicyElement.cs
- AlphabetConverter.cs
- CompilerCollection.cs
- ButtonChrome.cs
- ObjectTag.cs
- SchemaElementLookUpTable.cs
- NetTcpSecurityElement.cs
- AsymmetricSignatureFormatter.cs
- UnsafeNativeMethods.cs
- TrustManager.cs
- GenericAuthenticationEventArgs.cs
- BitmapMetadataBlob.cs
- JavaScriptObjectDeserializer.cs
- CodeParameterDeclarationExpression.cs
- HttpModuleCollection.cs
- GatewayDefinition.cs
- ConstraintManager.cs