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
- ModelUtilities.cs
- EnumerableCollectionView.cs
- Point.cs
- Helper.cs
- ValidationVisibilityAttribute.cs
- XmlBaseReader.cs
- TransactionFlowElement.cs
- ObjectMemberMapping.cs
- DependencyObjectValidator.cs
- StateMachineTimers.cs
- InputLanguageCollection.cs
- ColorAnimation.cs
- MenuRendererClassic.cs
- ProtocolImporter.cs
- SchemaElement.cs
- SafeEventLogWriteHandle.cs
- CfgRule.cs
- CachedResourceDictionaryExtension.cs
- IsolatedStorageException.cs
- ErasingStroke.cs
- CrossAppDomainChannel.cs
- CodeTryCatchFinallyStatement.cs
- XomlCompilerParameters.cs
- GridViewActionList.cs
- EvidenceTypeDescriptor.cs
- DSGeneratorProblem.cs
- CompositeActivityDesigner.cs
- IMembershipProvider.cs
- TimelineGroup.cs
- XPathAncestorIterator.cs
- DataRelationCollection.cs
- DebugInfoGenerator.cs
- CorrelationResolver.cs
- RichTextBoxAutomationPeer.cs
- DbDataReader.cs
- TypeConverter.cs
- RelatedPropertyManager.cs
- MenuCommand.cs
- RuntimeResourceSet.cs
- BlurEffect.cs
- WebControlParameterProxy.cs
- TagPrefixAttribute.cs
- FontWeight.cs
- HistoryEventArgs.cs
- Module.cs
- SeekableMessageNavigator.cs
- TableSectionStyle.cs
- XmlQueryOutput.cs
- IPAddress.cs
- Size3DValueSerializer.cs
- TextParagraphCache.cs
- PageContentCollection.cs
- EventMappingSettings.cs
- CharacterHit.cs
- TriggerAction.cs
- UserUseLicenseDictionaryLoader.cs
- UiaCoreTypesApi.cs
- DefaultWorkflowSchedulerService.cs
- FrameworkContentElementAutomationPeer.cs
- DbConnectionPoolGroupProviderInfo.cs
- SolidColorBrush.cs
- TransactionFormatter.cs
- TagMapInfo.cs
- XmlDownloadManager.cs
- EmulateRecognizeCompletedEventArgs.cs
- SiteMapDataSourceView.cs
- AuthenticationException.cs
- DesignerFrame.cs
- TwoPhaseCommit.cs
- TemplatePartAttribute.cs
- AttachmentCollection.cs
- SplineKeyFrames.cs
- DataGridItemAttachedStorage.cs
- HtmlAnchor.cs
- HostedTransportConfigurationManager.cs
- DataError.cs
- XmlDictionary.cs
- XmlDataLoader.cs
- BitmapImage.cs
- Asn1IntegerConverter.cs
- TextSpan.cs
- Compiler.cs
- SecurityStandardsManager.cs
- AssemblySettingAttributes.cs
- DataError.cs
- LayoutDump.cs
- SafeNativeMethods.cs
- objectquery_tresulttype.cs
- StylusPlugInCollection.cs
- SubMenuStyle.cs
- StreamInfo.cs
- SharedStatics.cs
- DataObjectFieldAttribute.cs
- ConfigurationElementCollection.cs
- Point3DCollectionConverter.cs
- XsltCompileContext.cs
- EdmType.cs
- DataBindingCollection.cs
- ScriptDescriptor.cs
- SerialErrors.cs