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
- WebBrowsableAttribute.cs
- ObjectAnimationBase.cs
- VideoDrawing.cs
- RowCache.cs
- RtfControls.cs
- VersionConverter.cs
- VariableQuery.cs
- EntityTypeBase.cs
- UInt64Storage.cs
- TemplateModeChangedEventArgs.cs
- PathSegment.cs
- RequiredAttributeAttribute.cs
- Triplet.cs
- StoreUtilities.cs
- ChangeDirector.cs
- DoubleAverageAggregationOperator.cs
- DesignerActionPropertyItem.cs
- DmlSqlGenerator.cs
- SqlClientPermission.cs
- BrowserDefinitionCollection.cs
- CssTextWriter.cs
- UInt16Converter.cs
- RequestQueryParser.cs
- InputReportEventArgs.cs
- COAUTHINFO.cs
- Stack.cs
- RegexParser.cs
- HttpCacheVary.cs
- MobileContainerDesigner.cs
- ComponentDispatcher.cs
- PassportIdentity.cs
- SharedPersonalizationStateInfo.cs
- ipaddressinformationcollection.cs
- DataGridLinkButton.cs
- IsolationInterop.cs
- DetailsViewActionList.cs
- UpdateCommand.cs
- DateTimeConverter.cs
- SQLInt64.cs
- WindowsToolbarItemAsMenuItem.cs
- ClientBuildManager.cs
- CompiledRegexRunnerFactory.cs
- RadioButtonList.cs
- FaultDescription.cs
- EventSinkHelperWriter.cs
- LocatorBase.cs
- SQLStringStorage.cs
- XhtmlBasicImageAdapter.cs
- MaskedTextBox.cs
- cache.cs
- glyphs.cs
- columnmapkeybuilder.cs
- DispatcherExceptionFilterEventArgs.cs
- Convert.cs
- GridViewDeleteEventArgs.cs
- ParentControlDesigner.cs
- ConfigurationStrings.cs
- MergablePropertyAttribute.cs
- ConsoleKeyInfo.cs
- PackageDigitalSignature.cs
- Clock.cs
- Parameter.cs
- HttpModuleActionCollection.cs
- UserControl.cs
- TextFormatterImp.cs
- MILUtilities.cs
- Sql8ExpressionRewriter.cs
- WebPartRestoreVerb.cs
- RedBlackList.cs
- XmlSchemaObject.cs
- JavaScriptObjectDeserializer.cs
- RightNameExpirationInfoPair.cs
- QueuePropertyVariants.cs
- SoapSchemaMember.cs
- EditorAttribute.cs
- Relationship.cs
- ReferenceAssemblyAttribute.cs
- SessionStateContainer.cs
- EditCommandColumn.cs
- BamlRecordHelper.cs
- Clipboard.cs
- NameSpaceEvent.cs
- InputScopeManager.cs
- EventSourceCreationData.cs
- PageHandlerFactory.cs
- M3DUtil.cs
- ArcSegment.cs
- Rotation3D.cs
- UnsafeNativeMethods.cs
- CodeDomExtensionMethods.cs
- EncoderParameters.cs
- ConfigXmlComment.cs
- User.cs
- MailMessage.cs
- ValuePattern.cs
- Bitmap.cs
- SchemaImporterExtensionsSection.cs
- SiteMapDesignerDataSourceView.cs
- XmlTextWriter.cs
- CharAnimationBase.cs