Click here to Skip to main content
15,894,410 members
Articles / Web Development / ASP.NET

PLINQO - Supercharge LINQ to SQL

Rate me:
Please Sign up or sign in to vote.
3.79/5 (6 votes)
17 Aug 2007CPOL6 min read 51.7K   143   17  
PLINQO is a collection of CodeSmith templates that are meant to replace and extend the LINQ to SQL designers.
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Xml.Serialization;
using DbmlSchema;
using CodeSmith.Engine;
using SchemaExplorer;
using System.Text;
using System.Collections;

namespace Manager
{
    public class ManagerGenerator
    {
        public static DataManager Create(DatabaseSchema databaseSchema, Database database)
        {
            DataManager managerMapping = new DataManager(database);
            GetMethods(databaseSchema, database, managerMapping);
            return managerMapping;
        }

        private static void GetMethods(DatabaseSchema databaseSchema, Database database, DataManager managerMapping)
        {
            foreach (EntityManager manager in managerMapping.Managers)
            {
                Table tableMapping = database.Tables[manager.TableName];
                TableSchema table;
                string[] parts = manager.TableName.Split('.');

                if (parts.Length == 2)
                    table = databaseSchema.Tables[parts[0], parts[1]];
                else
                    table = databaseSchema.Tables[manager.TableName];

                if (table == null)
                    continue;

                if (table.HasPrimaryKey)
                {
                    ManagerMethod method = GetMethodFromColumns(tableMapping, table.PrimaryKey.MemberColumns);
                    method.IsKey = true;
                    if (!manager.Methods.Contains(method.NameSuffix))
                        manager.Methods.Add(method);
                }

                GetIndexes(manager, tableMapping, table);
                GetForienKeys(manager, tableMapping, table);
            }
        }

        private static void GetForienKeys(EntityManager manager, Table tableMapping, TableSchema table)
        {
            List<ColumnSchema> columns = new List<ColumnSchema>();

            foreach (ColumnSchema column in table.ForeignKeyColumns)
            {
                columns.Add(column);

                ManagerMethod method = GetMethodFromColumns(tableMapping, columns);
                if (!manager.Methods.Contains(method.NameSuffix))
                    manager.Methods.Add(method);

                columns.Clear();
            }
        }

        private static void GetIndexes(EntityManager manager, Table tableMapping, TableSchema table)
        {
            foreach (IndexSchema index in table.Indexes)
            {
                ManagerMethod method = GetMethodFromColumns(tableMapping, index.MemberColumns);
                if (!manager.Methods.Contains(method.NameSuffix))
                    manager.Methods.Add(method);
            }
        }

        private static ManagerMethod GetMethodFromColumns(Table tableMapping, IList columns)
        {
            ManagerMethod method = new ManagerMethod();
            method.EntityName = tableMapping.Type.Name;
            string methodName = string.Empty;
            foreach (ColumnSchema column in columns)
            {
                Column columnMapping = tableMapping.Type.Columns[column.Name];
                method.Columns.Add(columnMapping);
                methodName += columnMapping.Member;
            }
            method.NameSuffix = methodName;
            return method;
        }

    }

    public class DataManager
    {
        public const string ManagerSuffix = "Manager";
        public const string DataManagerSuffix = "DataManager";

        public DataManager(Database database)
        {
            Initialize(database);
        }

        public DataManager()
        { }

        public void Initialize(Database database)
        {
            DataManagerName = StringUtil.ToPascalCase(database.Name) + DataManagerSuffix;
            DataContextName = CommonUtility.GetClassName(database.Class);
            foreach (Table table in database.Tables)
            {
                Managers.Add(new EntityManager(table));
            }
        }

        public string DataManagerName;
        public string DataContextName;
        public string ManagerContextName;

        public List<EntityManager> Managers = new List<EntityManager>();

        public override string ToString()
        {
            return DataManagerName;
        }
    }


    public class EntityManager
    {
        public EntityManager(Table table)
        {
            TableName = table.Name;
            EntityName = table.Type.Name;
            PropertyName = string.IsNullOrEmpty(table.Member) ? table.Type.Name : table.Member;
            ManagerName = EntityName + DataManager.ManagerSuffix;
            FieldName = CommonUtility.GetFieldName(ManagerName);
        }

        public EntityManager()
        { }

        public string TableName;
        public string EntityName;
        public string ManagerName;

        public string FieldName;
        public string PropertyName;

        public ManagerMethodCollection Methods = new ManagerMethodCollection();

        public override string ToString()
        {
            return ManagerName;
        }
    }

    public class ManagerMethod
    {
        public string NameSuffix;
        public string EntityName;
        public bool IsKey;

        public List<Column> Columns = new List<Column>();

        public override string ToString()
        {
            return NameSuffix;
        }
    }

    public class ManagerMethodCollection : KeyedCollection<string, ManagerMethod>
    {
        protected override string GetKeyForItem(ManagerMethod item)
        {
            return item.NameSuffix;
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions