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
- OleDbRowUpdatedEvent.cs
- GenericUI.cs
- InvalidEnumArgumentException.cs
- BufferAllocator.cs
- HttpCacheVary.cs
- SoapSchemaExporter.cs
- SqlVisitor.cs
- InfoCardSymmetricAlgorithm.cs
- ChannelManager.cs
- Configuration.cs
- AspNetPartialTrustHelpers.cs
- RawStylusInput.cs
- TrustSection.cs
- Parsers.cs
- ContextMenu.cs
- AnchoredBlock.cs
- HwndHostAutomationPeer.cs
- DataGridViewAutoSizeModeEventArgs.cs
- _LazyAsyncResult.cs
- xsdvalidator.cs
- OleDbError.cs
- WindowsFormsHostAutomationPeer.cs
- WebMessageEncodingBindingElement.cs
- NumberSubstitution.cs
- coordinatorfactory.cs
- ChtmlLinkAdapter.cs
- WeakHashtable.cs
- SqlMethodTransformer.cs
- ErrorHandler.cs
- DbConnectionClosed.cs
- MarkedHighlightComponent.cs
- SqlRemoveConstantOrderBy.cs
- WebPartPersonalization.cs
- DateTimeUtil.cs
- BasicViewGenerator.cs
- COM2FontConverter.cs
- WsatServiceAddress.cs
- dataprotectionpermissionattribute.cs
- GeneralTransform3D.cs
- XPathNodeList.cs
- SiteOfOriginContainer.cs
- X500Name.cs
- XmlNodeComparer.cs
- LinqDataSourceDeleteEventArgs.cs
- EdmToObjectNamespaceMap.cs
- DetailsViewUpdateEventArgs.cs
- Tuple.cs
- _ListenerRequestStream.cs
- WindowsAuthenticationEventArgs.cs
- IndicShape.cs
- TypedOperationInfo.cs
- DelegateHelpers.cs
- SQLInt16.cs
- SharedPerformanceCounter.cs
- ToolbarAUtomationPeer.cs
- FullTextState.cs
- SqlClientWrapperSmiStream.cs
- Matrix.cs
- NamespaceDecl.cs
- InitializerFacet.cs
- XmlQueryStaticData.cs
- XmlKeywords.cs
- EncryptedPackageFilter.cs
- PageHandlerFactory.cs
- Cell.cs
- RegularExpressionValidator.cs
- ByteAnimationUsingKeyFrames.cs
- PathNode.cs
- ChannelManager.cs
- ParseElementCollection.cs
- AsmxEndpointPickerExtension.cs
- SettingsAttributeDictionary.cs
- XmlStreamedByteStreamReader.cs
- ObjectDataSourceMethodEditor.cs
- ZipIOExtraFieldElement.cs
- FixedElement.cs
- DataControlHelper.cs
- AutomationIdentifierGuids.cs
- ApplySecurityAndSendAsyncResult.cs
- SrgsNameValueTag.cs
- ByeMessage11.cs
- BamlRecordHelper.cs
- ScopelessEnumAttribute.cs
- SocketInformation.cs
- LinqExpressionNormalizer.cs
- UpdateTracker.cs
- CharacterBufferReference.cs
- IisNotInstalledException.cs
- TimeSpanSecondsConverter.cs
- AttributeQuery.cs
- EntityCollection.cs
- isolationinterop.cs
- ArraySet.cs
- AssociationType.cs
- DragStartedEventArgs.cs
- SortedList.cs
- SafeLocalAllocation.cs
- ComponentResourceKey.cs
- HatchBrush.cs
- ToolTipAutomationPeer.cs