EFTableProvider.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / xsp / System / DynamicData / DynamicData / ModelProviders / EFTableProvider.cs / 1305376 / EFTableProvider.cs

                            using System.Collections.Generic; 
using System.Collections.ObjectModel;
using System.Data.Metadata.Edm;
using System.Data.Objects;
using System.Linq; 
using System.Reflection;
 
namespace System.Web.DynamicData.ModelProviders { 
    internal sealed class EFTableProvider : TableProvider {
        private ReadOnlyCollection _roColumns; 

        public EFTableProvider(EFDataModelProvider dataModel, EntitySet entitySet, EntityType entityType,
            Type entityClrType, Type parentEntityClrType, Type rootEntityClrType, string name)
            : base(dataModel) { 

            EntityType = entityClrType; 
            Name = name; 
            DataContextPropertyName = entitySet.Name;
            ParentEntityType = parentEntityClrType; 
            RootEntityType = rootEntityClrType;

            var genericMethod = DataModel.ContextType.GetMethod("CreateQuery");
            CreateQueryMethod = genericMethod.MakeGenericMethod(EntityType); 
            CreateQueryString = CreateEntitySqlQueryString(entitySet);
 
            var keyMembers = entityType.KeyMembers; 

            // columns (entity properties) 
            // note 1: keys are also available through es.ElementType.KeyMembers
            // note 2: this includes "nav properties", kind of fancy, two-way relationship objects
            var columns = new List();
            foreach (EdmMember m in entityType.Members) { 
                if (EFColumnProvider.IsSupportedEdmMemberType(m) && IsPublicProperty(entityClrType, m.Name)) {
                    EFColumnProvider entityMember = new EFColumnProvider(entityType, this, m, keyMembers.Contains(m)); 
                    columns.Add(entityMember); 
                }
            } 

            _roColumns = new ReadOnlyCollection(columns);
        }
 
        private static bool IsPublicProperty(Type entityClrType, string propertyName) {
            var property = entityClrType.GetProperty(propertyName); 
            return property != null && property.GetGetMethod() != null; 
        }
 
        private MethodInfo CreateQueryMethod { get; set; }

        private string CreateQueryString { get; set; }
 
        private static string CreateEntitySqlQueryString(EntitySet entitySet) {
            // Qualify the entity set name with the container name (in case the ObjectContext's default 
            // container name is not set or has an unexpected value) 
            return QuoteEntitySqlIdentifier(entitySet.EntityContainer.Name) + "." + QuoteEntitySqlIdentifier(entitySet.Name);
        } 

        private static string QuoteEntitySqlIdentifier(string identifier) {
            // Enclose in square brackets and escape the one reserved character (])
            return "[" + identifier.Replace("]", "]]") + "]"; 
        }
 
        public override ReadOnlyCollection Columns { 
            get {
                return _roColumns; 
            }
        }

        public override IQueryable GetQuery(object context) { 
            return (IQueryable)CreateQueryMethod.Invoke(context,
                new object[] { CreateQueryString, new ObjectParameter[0] }); 
        } 
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.


                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK