private Command _CreateUpdateByIdCommand(object data, Type type)
        {
            Anito.Data.Schema.TypeTable schemaTable = Provider.GetSchema(type);

            Command sqlCommand = new Command();

            StringBuilder commandTextBuilder = new StringBuilder();
            StringBuilder paramBuilder       = new StringBuilder();
            StringBuilder whereBuilder       = new StringBuilder();

            foreach (TypeColumn column in (from col in schemaTable where !col.ViewOnly select col))
            {
                if (sqlCommand.Parameters.ContainsKey(string.Format("{0}{1}", PARAM_IDENTIFIER, column.Name)))
                {
                    continue;
                }

                if (!column.IsIdentity)
                {
                    if (paramBuilder.Length > 0)
                    {
                        paramBuilder.Append(COMMA + SPACE);
                    }
                    paramBuilder.Append(column.Name + SPACE + EQUALS + SPACE);
                    paramBuilder.Append(PARAM_IDENTIFIER + column.Name);
                    if (!sqlCommand.Parameters.ContainsKey(string.Format("{0}{1}", PARAM_IDENTIFIER, column.Name)))
                    {
                        sqlCommand.AddParam(string.Format("{0}{1}", PARAM_IDENTIFIER, column.Name));
                    }
                }
                else if (column.IsIdentity)
                {
                    if (whereBuilder.Length > 0)
                    {
                        whereBuilder.Append(SPACE + AND + SPACE);
                    }
                    whereBuilder.Append(column.Name);
                    whereBuilder.Append(SPACE);
                    whereBuilder.Append(EQUALS);
                    whereBuilder.Append(SPACE);
                    whereBuilder.Append(PARAM_IDENTIFIER_ORIGINAL + column.Name);
                    if (!sqlCommand.Parameters.ContainsKey(string.Format("{0}{1}", PARAM_IDENTIFIER_ORIGINAL, column.Name)))
                    {
                        sqlCommand.AddParam(string.Format("{0}{1}", PARAM_IDENTIFIER_ORIGINAL, column.Name));
                    }
                }
            }
            commandTextBuilder.Append(string.Format("{0} {1} {2}",
                                                    UPDATE, schemaTable.UpdateSource, SET));
            commandTextBuilder.Append(SPACE);
            commandTextBuilder.Append(paramBuilder.ToString());
            commandTextBuilder.Append(SPACE);
            commandTextBuilder.Append(WHERE);
            commandTextBuilder.Append(SPACE);
            commandTextBuilder.Append(whereBuilder.ToString());
            commandTextBuilder.Append(SEMI_COLON);

            sqlCommand.SqlCommand.CommandText = commandTextBuilder.ToString();
            return(sqlCommand);
        }
        private string SelectColumnsStatement(Type type)
        {
            if (!ColumnSelectCache.ContainsKey(type))
            {
                Anito.Data.Schema.TypeTable schemaTable = Provider.GetSchema(type);
                StringBuilder columnSb = new StringBuilder();
                foreach (TypeColumn column in schemaTable)
                {
                    if (columnSb.Length > 0)
                    {
                        columnSb.Append(", ");
                    }

                    if (column.IsIdentity)
                    {
                        columnSb.Append(string.Format("{0}.{1} AS {2}", schemaTable.ViewSource, column.Name, column.Name));
                    }
                    else
                    {
                        if (!column.IsNullable)
                        {
                            switch (column.Type.Name.ToUpper())
                            {
                            case "INT16":
                            case "INT32":
                            case "INT64":
                            case "SINGLE":
                            case "DATETIME":
                            case "DECIMAL":
                            case "DOUBLE":
                            case "BOOLEAN":
                                columnSb.Append(string.Format("ISNULL({0}.{1},{2}) AS {3}", schemaTable.ViewSource, column.Name, 0, column.Name));
                                break;

                            case "STRING":
                            case "BYTE[]":
                            case "BYTE":
                                columnSb.Append(string.Format("{0}.{1} AS {2}", schemaTable.ViewSource, column.Name, column.Name));
                                break;

                            case "GUID":
                                columnSb.Append(string.Format("ISNULL({0}.{1},'{2}') AS {3}", schemaTable.ViewSource, column.Name, default(Guid), column.Name));
                                break;
                            }
                        }
                        else
                        {
                            columnSb.Append(string.Format("{0}.{1} AS {2}", schemaTable.ViewSource, column.Name, column.Name));
                        }
                    }
                }
                ColumnSelectCache.Add(type, columnSb.ToString());
            }
            return(ColumnSelectCache[type]);
        }
        public override ICommand CreateCountCommand <T>()
        {
            Type   typeT    = typeof(T);
            string uniqueId = "1801F51F-A4EC-4A78-8AE8-BCB30402E4B5";

            if (!CommandCache.ContainsKey(string.Format(CACHE_KEY, uniqueId, typeT.FullName)))
            {
                Anito.Data.Schema.TypeTable schemaTable = Provider.GetSchema(typeT);
                Command sqlCommand = (Command)CreateCountCommand(schemaTable.ViewSource);
                CommandCache.Add(string.Format(CACHE_KEY, uniqueId, typeT.FullName), sqlCommand);
            }
            return(CommandCache[string.Format(CACHE_KEY, uniqueId, typeT.FullName)]);
        }
        public override ICommand CreateDeleteByKeyCommand(object data, Type type)
        {
            string uniqueId = "92C92A43-D467-4931-8C12-F26AA936E7D7";

            if (!CommandCache.ContainsKey(string.Format(CACHE_KEY, uniqueId, type.FullName)))
            {
                Anito.Data.Schema.TypeTable schemaTable = Provider.GetSchema(type);

                Command sqlCommand = _CreateDeletebyKeyCommand(data, schemaTable);
                CommandCache.Add(string.Format(CACHE_KEY, uniqueId, type.FullName), sqlCommand);
            }
            return(CommandCache[string.Format(CACHE_KEY, uniqueId, type.FullName)]);
        }
        public override ICommand CreateDeleteByIdCommand(object data, Type type)
        {
            string uniqueId = "F58B3FAE-6E43-4B39-9850-8E2D4EC63419";

            if (!CommandCache.ContainsKey(string.Format(CACHE_KEY, uniqueId, type.FullName)))
            {
                Anito.Data.Schema.TypeTable schemaTable = Provider.GetSchema(type);

                Command sqlCommand = _CreateDeletebyIdCommand(data, schemaTable);
                CommandCache.Add(string.Format(CACHE_KEY, uniqueId, type.FullName), sqlCommand);
            }
            return(CommandCache[string.Format(CACHE_KEY, uniqueId, type.FullName)]);
        }
        public override ICommand CreateGetListCommand <T>(Expression expression)
        {
            Type typeT = typeof(T);

            Anito.Data.Schema.TypeTable schemaTable = Provider.GetSchema(typeT);

            Translator translator = new Translator(Provider);
            string     whereText  = translator.Translate(expression);

            Command sqlCommand = new Command();

            sqlCommand.SqlCommand.CommandText = string.Format(
                "{0} {1} {2} {3} {4} {5}",
                SELECT, SelectColumnsStatement(typeT), FROM, schemaTable.ViewSource, WHERE, whereText
                );
            return(sqlCommand);
        }
        public override ICommand CreateGetListCommand <T>(IFilterCriteria criteria)
        {
            Type   typeT    = typeof(T);
            string uniqueId = "232FDED0-6C97-40B4-930F-FC190124D181";

            if (!CommandCache.ContainsKey(string.Format(CACHE_KEY, uniqueId, typeT.FullName)))
            {
                Anito.Data.Schema.TypeTable schemaTable = Provider.GetSchema(typeT);

                Command sqlCommand = new Command();

                sqlCommand.SqlCommand.CommandText = string.Format(
                    "{0} {1} {2} {3}",
                    SELECT, SelectColumnsStatement(typeT), FROM, schemaTable.ViewSource
                    );
                CommandCache.Add(string.Format(CACHE_KEY, uniqueId, typeT.FullName), sqlCommand);
            }
            return(CommandCache[string.Format(CACHE_KEY, uniqueId, typeT.FullName)]);
        }
        public override ICommand CreateGetObjectByKeyCommand <T>()
        {
            Type   typeT    = typeof(T);
            string uniqueId = "4F9C6FBE-2971-46A8-A367-B28AB5F65895";

            if (!CommandCache.ContainsKey(string.Format(CACHE_KEY, uniqueId, typeT.FullName)))
            {
                Anito.Data.Schema.TypeTable schemaTable = Provider.GetSchema(typeT);

                Command sqlCommand = new Command();

                var keyList = from column in schemaTable where column.IsPrimaryKey select column;

                if (keyList.Count() < 1)
                {
                    throw new TypeNoKeyException(typeof(T));
                }

                StringBuilder paramBuilder = new StringBuilder();
                foreach (Anito.Data.Schema.TypeColumn column in keyList)
                {
                    if (paramBuilder.Length > 0)
                    {
                        paramBuilder.Append(string.Format("{0}{1}{2}", SPACE, AND, SPACE));
                    }
                    paramBuilder.Append(string.Format("{0} = {1}{2}", column.Name, PARAM_IDENTIFIER, column.Name));
                    sqlCommand.AddParam(string.Format("{0}{1}", PARAM_IDENTIFIER, column.Name));
                }

                sqlCommand.SqlCommand.CommandText =
                    string.Format("{0} {1} {2} {3} {4} {5}",
                                  SELECT, SelectColumnsStatement(typeT), FROM, schemaTable.ViewSource, WHERE, paramBuilder.ToString());
                CommandCache.Add(string.Format(CACHE_KEY, uniqueId, typeT.FullName), sqlCommand);
            }
            return(CommandCache[string.Format(CACHE_KEY, uniqueId, typeT.FullName)]);
        }
        protected override Expression ProcessMemberAccess(MemberExpression expression)
        {
            if (expression.Expression != null && expression.Expression.NodeType == ExpressionType.Parameter)
            {
                Anito.Data.Schema.TypeTable schemaTable = Provider.GetSchema(expression.Member.DeclaringType);

                CommandTextBuilder.Append(schemaTable.GetDbColumn(expression.Member.Name));

                return(expression);
            }
            else if (expression.Expression != null && expression.Expression.NodeType == ExpressionType.MemberAccess)
            {
                PropertyInfo propertyInfo = expression.Member as PropertyInfo;

                MemberExpression memberExpression = expression.Expression as MemberExpression;

                FieldInfo          fieldInfo   = memberExpression.Member as FieldInfo;
                ConstantExpression cExpression = memberExpression.Expression as ConstantExpression;
                object             objectValue = fieldInfo.GetValue(cExpression.Value);

                object value = propertyInfo.GetValue(objectValue, null);

                switch (Type.GetTypeCode(value.GetType()))
                {
                case TypeCode.String | TypeCode.DateTime:
                    CommandTextBuilder.Append(string.Format("'{0}'", value));
                    break;

                default:
                    CommandTextBuilder.Append(value);
                    break;
                }
                return(expression);
            }
            else if (expression.Expression != null && expression.Expression.NodeType == ExpressionType.Constant)
            {
                FieldInfo          fieldInfo   = expression.Member as FieldInfo;
                ConstantExpression cExpression = expression.Expression as ConstantExpression;
                object             value       = fieldInfo.GetValue(cExpression.Value);

                switch (Type.GetTypeCode(value.GetType()))
                {
                case TypeCode.String | TypeCode.DateTime:
                    CommandTextBuilder.Append(string.Format("'{0}'", value));
                    break;

                default:
                    CommandTextBuilder.Append(value);
                    break;
                }
                return(expression);
            }
            else if (expression.Expression != null && expression.Expression.NodeType == ExpressionType.Call)
            {
                PropertyInfo propertyInfo = expression.Member as PropertyInfo;

                MethodCallExpression callExpression = expression.Expression as MethodCallExpression;

                MethodInfo methodInfo   = callExpression.Method;
                object[]   methodParams = new object[callExpression.Arguments.Count];
                for (int i = 0; i < callExpression.Arguments.Count; i++)
                {
                    ConstantExpression consExpression = callExpression.Arguments[i] as ConstantExpression;
                    methodParams[i] = consExpression.Value;
                }

                MemberExpression memberExpression = callExpression.Object as MemberExpression;
                FieldInfo        fieldInfo        = memberExpression.Member as FieldInfo;

                ConstantExpression cExpression = memberExpression.Expression as ConstantExpression;

                object objectContainer = fieldInfo.GetValue(cExpression.Value);

                object objectValue = methodInfo.Invoke(objectContainer, methodParams);

                object value = propertyInfo.GetValue(objectValue, null);

                switch (Type.GetTypeCode(value.GetType()))
                {
                case TypeCode.String | TypeCode.DateTime:
                    CommandTextBuilder.Append(string.Format("'{0}'", value));
                    break;

                default:
                    CommandTextBuilder.Append(value);
                    break;
                }
                return(expression);
            }
            throw new NotSupportedException(string.Format("The member '{0}' is not supported", expression.Member.Name));
        }
        public override ICommand CreateInsertCommand(object data)
        {
            Type   typeT    = data.GetType();
            string uniqueId = "26ABBE10-3D2A-40be-ABAC-F92EF9040608";

            if (!CommandCache.ContainsKey(string.Format(CACHE_KEY, uniqueId, typeT.FullName)))
            {
                Anito.Data.Schema.TypeTable schemaTable = Provider.GetSchema(typeT);

                Command sqlCommand = new Command();

                StringBuilder commandTextBuilder = new StringBuilder();
                StringBuilder paramBuilder       = new StringBuilder();
                StringBuilder columnBuilder      = new StringBuilder();

                TypeColumn identityColumn = null;
                foreach (TypeColumn column in (from col in schemaTable where !col.ViewOnly select col))
                {
                    if (column.IsIdentity)
                    {
                        identityColumn = column;
                        continue;
                    }

                    if (sqlCommand.Parameters.ContainsKey(string.Format("{0}{1}", PARAM_IDENTIFIER, column.Name)))
                    {
                        continue;
                    }

                    if (columnBuilder.Length > 0 && paramBuilder.Length > 0)
                    {
                        columnBuilder.Append(COMMA);
                        paramBuilder.Append(COMMA);
                    }
                    columnBuilder.Append(column.Name);
                    paramBuilder.Append(PARAM_IDENTIFIER + column.Name);
                    if (!sqlCommand.Parameters.ContainsKey(string.Format("{0}{1}", PARAM_IDENTIFIER, column.Name)))
                    {
                        sqlCommand.AddParam(string.Format("{0}{1}", PARAM_IDENTIFIER, column.Name));
                    }
                }
                commandTextBuilder.Append(string.Format("{0} {1} {2}",
                                                        INSERT, INTO, schemaTable.UpdateSource));
                commandTextBuilder.Append(OPEN_PARENTHESES);
                commandTextBuilder.Append(columnBuilder.ToString());
                commandTextBuilder.Append(CLOSE_PARENTHESES);
                commandTextBuilder.Append(SPACE);
                commandTextBuilder.Append(VALUES + OPEN_PARENTHESES);
                commandTextBuilder.Append(paramBuilder.ToString());
                commandTextBuilder.Append(CLOSE_PARENTHESES + SEMI_COLON);

                if (identityColumn != null)
                {
                    commandTextBuilder.Append(string.Format("SELECT {0} FROM {1} WHERE {2} = (SELECT IDENT_CURRENT('{3}'));"
                                                            , schemaTable.ColumnList
                                                            , schemaTable.ViewSource
                                                            , identityColumn.Name
                                                            , schemaTable.ViewSource));
                }

                sqlCommand.SqlCommand.CommandText = commandTextBuilder.ToString();

                CommandCache.Add(string.Format(CACHE_KEY, uniqueId, typeT.FullName), sqlCommand);
            }
            return(CommandCache[string.Format(CACHE_KEY, uniqueId, typeT.FullName)]);
        }
        public override ICommand CreateGetListByPageCommand <T>(Expression expression)
        {
            Type typeT = typeof(T);

            Anito.Data.Schema.TypeTable schemaTable = Provider.GetSchema(typeT);

            Command sqlCommand = new Command();

            string tempTable = SHARP + "D89646AM" + schemaTable.ViewSource;

            StringBuilder columnBuilder     = new StringBuilder();
            StringBuilder keyBuilder        = new StringBuilder();
            StringBuilder keyCompareBuilder = new StringBuilder();

            foreach (Anito.Data.Schema.TypeColumn column in schemaTable)
            {
                if (columnBuilder.Length > 0)
                {
                    columnBuilder.Append(COMMA + SPACE);
                }
                columnBuilder.Append(schemaTable.ViewSource + DOT + column.Name);

                if (column.IsPrimaryKey)
                {
                    if (keyBuilder.Length > 0)
                    {
                        keyBuilder.Append(COMMA + SPACE);
                    }
                    keyBuilder.Append(column.Name);

                    if (keyCompareBuilder.Length > 0)
                    {
                        keyCompareBuilder.Append(SPACE + AND + SPACE);
                    }
                    keyCompareBuilder.Append(tempTable + DOT + column.Name);
                    keyCompareBuilder.Append(SPACE + EQUALS + SPACE);
                    keyCompareBuilder.Append(schemaTable.ViewSource + DOT + column.Name);
                }
            }

            Translator translator = new Translator(Provider);
            string     whereText  = translator.Translate(expression);

            sqlCommand.SqlCommand.CommandText = string.Format(GET_TABLE_BY_PAGE_WHERE,
                                                              tempTable,
                                                              tempTable,
                                                              keyBuilder.ToString(),
                                                              keyBuilder.ToString(),
                                                              tempTable,
                                                              schemaTable.ViewSource,
                                                              whereText,
                                                              SelectColumnsStatement(typeT),
                                                              schemaTable.ViewSource,
                                                              tempTable,
                                                              keyCompareBuilder.ToString(),
                                                              tempTable,
                                                              tempTable);

            sqlCommand.AddParam(string.Format("{0}{1}", PARAM_IDENTIFIER, PAGE));
            sqlCommand.AddParam(string.Format("{0}{1}", PARAM_IDENTIFIER, PAGE_SIZE));

            return(sqlCommand);
        }
        public override ICommand CreateGetListByPageCommand <T>()
        {
            Type   typeT    = typeof(T);
            string uniqueId = "D89646AE-F93B-4D59-9A0C-7AF5A6B79F5D";

            if (!CommandCache.ContainsKey(string.Format(CACHE_KEY, uniqueId, typeT.FullName)))
            {
                Anito.Data.Schema.TypeTable schemaTable = Provider.GetSchema(typeT);

                Command sqlCommand = new Command();

                string tempTable = SHARP + "D89646AE" + schemaTable.ViewSource;

                StringBuilder columnBuilder     = new StringBuilder();
                StringBuilder keyBuilder        = new StringBuilder();
                StringBuilder keyCompareBuilder = new StringBuilder();

                foreach (Anito.Data.Schema.TypeColumn column in schemaTable)
                {
                    if (columnBuilder.Length > 0)
                    {
                        columnBuilder.Append(COMMA + SPACE);
                    }
                    columnBuilder.Append(schemaTable.ViewSource + DOT + column.Name);

                    if (column.IsPrimaryKey)
                    {
                        if (keyBuilder.Length > 0)
                        {
                            keyBuilder.Append(COMMA + SPACE);
                        }
                        keyBuilder.Append(column.Name);

                        if (keyCompareBuilder.Length > 0)
                        {
                            keyCompareBuilder.Append(SPACE + AND + SPACE);
                        }
                        keyCompareBuilder.Append(tempTable + DOT + column.Name);
                        keyCompareBuilder.Append(SPACE + EQUALS + SPACE);
                        keyCompareBuilder.Append(schemaTable.ViewSource + DOT + column.Name);
                    }
                }

                sqlCommand.SqlCommand.CommandText = string.Format(GET_TABLE_BY_PAGE,
                                                                  tempTable,
                                                                  tempTable,
                                                                  keyBuilder.ToString(),
                                                                  keyBuilder.ToString(),
                                                                  tempTable,
                                                                  schemaTable.ViewSource,
                                                                  SelectColumnsStatement(typeT),
                                                                  schemaTable.ViewSource,
                                                                  tempTable,
                                                                  keyCompareBuilder.ToString(),
                                                                  tempTable,
                                                                  tempTable);

                sqlCommand.AddParam(string.Format("{0}{1}", PARAM_IDENTIFIER, PAGE));
                sqlCommand.AddParam(string.Format("{0}{1}", PARAM_IDENTIFIER, PAGE_SIZE));

                CommandCache.Add(string.Format(CACHE_KEY, uniqueId, typeT.FullName), sqlCommand);
            }
            return(CommandCache[string.Format(CACHE_KEY, uniqueId, typeT.FullName)]);
        }