Пример #1
0
        /// <summary>
        /// Update
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql打包对象</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Update(NewExpression expression, SqlWrapper sqlWrapper)
        {
            for (int i = 0; i < expression.Members.Count; i++)
            {
                var m = expression.Members[i];
                var t = m.DeclaringType.ToString().Contains("AnonymousType") ?
                        sqlWrapper.DefaultType :
                        m.DeclaringType;

                var(columnName, isInsert, isUpdate) = sqlWrapper.GetColumnInfo(t, m);
                if (isUpdate)
                {
                    var value = expression.Arguments[i]?.ToObject();
                    if (value != null || (sqlWrapper.IsEnableNullValue && value == null))
                    {
                        sqlWrapper += columnName + " = ";
                        sqlWrapper.AddDbParameter(value);
                        sqlWrapper += ",";
                    }
                }
            }

            if (sqlWrapper[sqlWrapper.Length - 1] == ',')
            {
                sqlWrapper.Remove(sqlWrapper.Length - 1, 1);
            }

            return(sqlWrapper);
        }
Пример #2
0
        /// <summary>
        /// Update
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql包装器</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Update(NewExpression expression, SqlWrapper sqlWrapper)
        {
            for (int i = 0; i < expression.Members.Count; i++)
            {
                var m = expression.Members[i];
                var t = m.DeclaringType.IsAnonymousType() ?
                        sqlWrapper.DefaultType :
                        m.DeclaringType;

                var columnInfo = sqlWrapper.GetColumnInfo(t, m);
                if (columnInfo.IsUpdate)
                {
                    var value = expression.Arguments[i]?.ToObject();
                    if (value != null || (sqlWrapper.IsEnableNullValue && value == null))
                    {
                        sqlWrapper += columnInfo.ColumnName + " = ";
                        sqlWrapper.AddDbParameter(value, columnInfo.DataType);
                        sqlWrapper += ",";
                    }
                }
            }

            sqlWrapper.RemoveLast(',');

            return(sqlWrapper);
        }
Пример #3
0
        /// <summary>
        /// Insert
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql包装器</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Insert(NewExpression expression, SqlWrapper sqlWrapper)
        {
            if (sqlWrapper.DatabaseType != DatabaseType.Oracle)
            {
                sqlWrapper.Append("(");
            }

            var fields = new List <string>();

            for (int i = 0; i < expression.Members?.Count; i++)
            {
                var m = expression.Members[i];
                var t = m.DeclaringType.IsAnonymousType() ?
                        sqlWrapper.DefaultType :
                        m.DeclaringType;

                var columnInfo = sqlWrapper.GetColumnInfo(t, m);
                if (columnInfo.IsInsert)
                {
                    var value = expression.Arguments[i]?.ToObject();
                    if (value != null || (sqlWrapper.IsEnableNullValue && value == null))
                    {
                        sqlWrapper.AddDbParameter(value, columnInfo.DataType);
                        if (!fields.Contains(columnInfo.ColumnName))
                        {
                            fields.Add(columnInfo.ColumnName);
                        }
                        sqlWrapper += ",";
                    }
                }
            }

            if (sqlWrapper[^ 1] == ',')
        /// <summary>
        /// Update
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql打包对象</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Update(MemberInitExpression expression, SqlWrapper sqlWrapper)
        {
            foreach (MemberAssignment m in expression.Bindings)
            {
                var type = m.Member.DeclaringType.ToString().Contains("AnonymousType") ?
                           sqlWrapper.DefaultType :
                           m.Member.DeclaringType;

                var(columnName, isInsert, isUpdate) = sqlWrapper.GetColumnInfo(type, m.Member);
                if (isUpdate)
                {
                    var value = m.Expression.ToObject();
                    if (value != null || (sqlWrapper.IsEnableNullValue && value == null))
                    {
                        sqlWrapper += columnName + " = ";
                        sqlWrapper.AddDbParameter(value);
                        sqlWrapper += ",";
                    }
                }
            }

            if (sqlWrapper[sqlWrapper.Length - 1] == ',')
            {
                sqlWrapper.Remove(sqlWrapper.Length - 1, 1);
            }

            return(sqlWrapper);
        }
        /// <summary>
        /// Select
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql包装器</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Select(MemberExpression expression, SqlWrapper sqlWrapper)
        {
            if (expression.Expression.NodeType != ExpressionType.Constant)
            {
                var type = expression.Expression.Type != expression.Member.DeclaringType ?
                           expression.Expression.Type :
                           expression.Member.DeclaringType;

                var tableName  = sqlWrapper.GetTableName(type);
                var parameter  = expression.Expression as ParameterExpression;
                var tableAlias = sqlWrapper.GetTableAlias(tableName, parameter?.Name);

                if (tableAlias.IsNotNullOrEmpty())
                {
                    tableAlias += ".";
                }

                sqlWrapper.AddField(tableAlias + sqlWrapper.GetColumnInfo(expression.Member.DeclaringType, expression.Member).ColumnName);
            }
            else
            {
                var field = expression.ToObject()?.ToString();
                sqlWrapper.AddField(field);
            }

            return(sqlWrapper);
        }
        /// <summary>
        /// Update
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql打包对象</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Update(MemberExpression expression, SqlWrapper sqlWrapper)
        {
            var obj        = expression.ToObject();
            var properties = obj?.GetType().GetProperties();

            foreach (var item in properties)
            {
                var type = item.DeclaringType.ToString().Contains("AnonymousType") ?
                           sqlWrapper.DefaultType :
                           item.DeclaringType;

                var(columnName, isInsert, isUpdate) = sqlWrapper.GetColumnInfo(type, item);
                if (isUpdate)
                {
                    var value = item.GetValue(obj, null);
                    if (value != null || (sqlWrapper.IsEnableNullValue && value == null))
                    {
                        sqlWrapper += columnName + " = ";
                        sqlWrapper.AddDbParameter(value);
                        sqlWrapper += ",";
                    }
                }
            }

            if (sqlWrapper[sqlWrapper.Length - 1] == ',')
            {
                sqlWrapper.Remove(sqlWrapper.Length - 1, 1);
            }

            return(sqlWrapper);
        }
        /// <summary>
        /// Sum
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql包装器</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Sum(MemberExpression expression, SqlWrapper sqlWrapper)
        {
            if (expression?.Member != null)
            {
                var columnName = sqlWrapper.GetColumnInfo(expression.Member.DeclaringType, expression.Member).ColumnName;
                sqlWrapper.AddField(columnName);
            }

            return(sqlWrapper);
        }
Пример #8
0
        /// <summary>
        /// Insert
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql包装器</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Insert(NewExpression expression, SqlWrapper sqlWrapper)
        {
            if (sqlWrapper.DatabaseType != DatabaseType.Oracle)
            {
                sqlWrapper.Append("(");
            }

            var fields = new List <string>();

            for (int i = 0; i < expression.Members?.Count; i++)
            {
                var m = expression.Members[i];
                var t = m.DeclaringType.IsAnonymousType() ?
                        sqlWrapper.DefaultType :
                        m.DeclaringType;

                var columnInfo = sqlWrapper.GetColumnInfo(t, m);
                if (columnInfo.IsInsert)
                {
                    var value = expression.Arguments[i]?.ToObject();
                    if (value != null || (sqlWrapper.IsEnableNullValue && value == null))
                    {
                        sqlWrapper.AddDbParameter(value, columnInfo.DataType);
                        if (!fields.Contains(columnInfo.ColumnName))
                        {
                            fields.Add(columnInfo.ColumnName);
                        }
                        sqlWrapper += ",";
                    }
                }
            }

            if (sqlWrapper[sqlWrapper.Length - 1] == ',')
            {
                sqlWrapper.Remove(sqlWrapper.Length - 1, 1);
                if (sqlWrapper.DatabaseType != DatabaseType.Oracle)
                {
                    sqlWrapper.Append(")");
                }
                else
                {
                    sqlWrapper.Append(" FROM DUAL");
                }
            }

            sqlWrapper.Reset(string.Format(sqlWrapper.ToString(), string.Join(",", fields).TrimEnd(',')));

            return(sqlWrapper);
        }
        /// <summary>
        /// Insert
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql打包对象</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Insert(MemberInitExpression expression, SqlWrapper sqlWrapper)
        {
            if (sqlWrapper.DatabaseType != DatabaseType.Oracle)
            {
                sqlWrapper.Append("(");
            }

            var fields = new List <string>();

            foreach (MemberAssignment m in expression.Bindings)
            {
                var type = m.Member.DeclaringType.ToString().Contains("AnonymousType") ?
                           sqlWrapper.DefaultType :
                           m.Member.DeclaringType;

                var(columnName, isInsert, isUpdate) = sqlWrapper.GetColumnInfo(type, m.Member);
                if (isInsert)
                {
                    var value = m.Expression.ToObject();
                    if (value != null || (sqlWrapper.IsEnableNullValue && value == null))
                    {
                        sqlWrapper.AddDbParameter(value);
                        if (!fields.Contains(columnName))
                        {
                            fields.Add(columnName);
                        }
                        sqlWrapper += ",";
                    }
                }
            }

            if (sqlWrapper[sqlWrapper.Length - 1] == ',')
            {
                sqlWrapper.Remove(sqlWrapper.Length - 1, 1);
                if (sqlWrapper.DatabaseType != DatabaseType.Oracle)
                {
                    sqlWrapper.Append(")");
                }
                else
                {
                    sqlWrapper.Append(" FROM DUAL");
                }
            }

            sqlWrapper.Reset(string.Format(sqlWrapper.ToString(), string.Join(",", fields).TrimEnd(',')));
            return(sqlWrapper);
        }
        /// <summary>
        /// Where
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql包装器</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Where(MemberExpression expression, SqlWrapper sqlWrapper)
        {
            //此处判断expression的Member是否是可空值类型
            if (expression.Expression?.NodeType == ExpressionType.MemberAccess && expression.Member.DeclaringType.IsNullable())
            {
                expression = expression.Expression as MemberExpression;
            }

            if (expression != null)
            {
                if (expression.Expression?.NodeType == ExpressionType.Parameter)
                {
                    var type = expression.Expression.Type != expression.Member.DeclaringType ?
                               expression.Expression.Type :
                               expression.Member.DeclaringType;

                    var tableName  = sqlWrapper.GetTableName(type);
                    var tableAlias = (expression.Expression as ParameterExpression)?.Name;
                    tableAlias = sqlWrapper.GetTableAlias(tableName, tableAlias);

                    if (tableAlias.IsNotNullOrEmpty())
                    {
                        tableAlias += ".";
                    }

                    sqlWrapper += tableAlias + sqlWrapper.GetColumnInfo(expression.Member.DeclaringType, expression.Member).ColumnName;

                    //字段是bool类型
                    if (expression.NodeType == ExpressionType.MemberAccess && expression.Type.GetCoreType() == typeof(bool))
                    {
                        if (sqlWrapper.DatabaseType is DatabaseType.MySql or DatabaseType.PostgreSql)
                        {
                            sqlWrapper += " IS TRUE";
                        }
                        else
                        {
                            sqlWrapper += " = 1";
                        }
                    }
                }
                else
                {
                    sqlWrapper.AddDbParameter(expression.ToObject());
                }
            }
Пример #11
0
        /// <summary>
        /// Select
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql打包对象</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Select(MemberInitExpression expression, SqlWrapper sqlWrapper)
        {
            if (expression.Bindings?.Count > 0)
            {
                foreach (MemberAssignment memberAssignment in expression.Bindings)
                {
                    var type = expression.Type != memberAssignment.Member.DeclaringType ?
                               expression.Type :
                               memberAssignment.Member.DeclaringType;

                    var aliasName = memberAssignment.Member.Name;
                    var tableName = sqlWrapper.GetTableName(type);

                    if ((memberAssignment.Expression as MemberExpression)?.Expression is ParameterExpression parameterExpr)
                    {
                        var tableAlias = sqlWrapper.GetTableAlias(tableName, parameterExpr.Name);

                        if (!tableAlias.IsNullOrEmpty())
                        {
                            tableAlias += ".";
                        }

                        var fieldName = tableAlias + sqlWrapper.GetColumnInfo(type, memberAssignment.Member).columnName;

                        sqlWrapper.AddField(fieldName);
                    }
                    else
                    {
                        var fieldName = memberAssignment.Expression.ToObject().ToString();

                        sqlWrapper.AddField(fieldName);
                    }

                    sqlWrapper.SelectFields[sqlWrapper.FieldCount - 1] += $" AS {sqlWrapper.GetFormatName(aliasName)}";
                }
            }
            else
            {
                sqlWrapper.AddField("*");
            }

            return(sqlWrapper);
        }
        /// <summary>
        /// Insert
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql包装器</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Insert(ListInitExpression expression, SqlWrapper sqlWrapper)
        {
            if (expression.ToObject() is IEnumerable collection)
            {
                var i      = 0;
                var fields = new List <string>();

                foreach (var item in collection)
                {
                    if (sqlWrapper.DatabaseType != DatabaseType.Oracle)
                    {
                        sqlWrapper.Append("(");
                    }

                    if (i > 0 && sqlWrapper.DatabaseType == DatabaseType.Oracle)
                    {
                        sqlWrapper.Append(" UNION ALL SELECT ");
                    }

                    var properties = item?.GetType().GetProperties();
                    foreach (var p in properties)
                    {
                        var type = p.DeclaringType.IsAnonymousType() ?
                                   sqlWrapper.DefaultType :
                                   p.DeclaringType;

                        var columnInfo = sqlWrapper.GetColumnInfo(type, p);
                        if (columnInfo.IsInsert)
                        {
                            var value = p.GetValue(item, null);
                            if (value != null || (sqlWrapper.IsEnableNullValue && value == null))
                            {
                                sqlWrapper.AddDbParameter(value, columnInfo.DataType);
                                if (!fields.Contains(columnInfo.ColumnName))
                                {
                                    fields.Add(columnInfo.ColumnName);
                                }
                                sqlWrapper += ",";
                            }
                        }
                    }

                    if (sqlWrapper[^ 1] == ',')
        /// <summary>
        /// Join
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql包装器</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Join(MemberExpression expression, SqlWrapper sqlWrapper)
        {
            var type = expression.Expression.Type != expression.Member.DeclaringType ?
                       expression.Expression.Type :
                       expression.Member.DeclaringType;

            var tableName  = sqlWrapper.GetTableName(type);
            var parameter  = expression.Expression as ParameterExpression;
            var tableAlias = sqlWrapper.GetTableAlias(tableName, parameter?.Name);

            if (tableAlias.IsNotNullOrEmpty())
            {
                tableAlias += ".";
            }

            sqlWrapper += tableAlias + sqlWrapper.GetColumnInfo(expression.Member.DeclaringType, expression.Member).ColumnName;

            return(sqlWrapper);
        }
Пример #14
0
        /// <summary>
        /// Select
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql包装器</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Select(MemberInitExpression expression, SqlWrapper sqlWrapper)
        {
            if (expression.Bindings?.Count > 0)
            {
                foreach (MemberAssignment memberAssignment in expression.Bindings)
                {
                    if (memberAssignment.Expression is MemberExpression memberExpr && memberExpr.Expression is ParameterExpression parameterExpr)
                    {
                        var type       = parameterExpr.Type;
                        var tableName  = sqlWrapper.GetTableName(type);
                        var tableAlias = sqlWrapper.GetTableAlias(tableName, parameterExpr.Name);

                        if (tableAlias.IsNotNullOrEmpty())
                        {
                            tableAlias += ".";
                        }

                        var fieldName = tableAlias + sqlWrapper.GetColumnInfo(type, memberExpr.Member).ColumnName;

                        sqlWrapper.AddField(fieldName);
                    }
                    else
                    {
                        var fieldName = memberAssignment.Expression.ToObject().ToString();

                        sqlWrapper.AddField(fieldName);
                    }

                    var aliasName = sqlWrapper.GetColumnName(memberAssignment.Member.Name);

                    var field = sqlWrapper.SelectFields[sqlWrapper.FieldCount - 1];

                    if (field.IsNotNullOrEmpty() && field.Contains(".") && !field.Contains("(", ")"))
                    {
                        field = field.Split('.').LastOrDefault();
                    }

                    if (!field.Equals(!sqlWrapper.IsEnableFormat, aliasName))
                    {
                        sqlWrapper.SelectFields[sqlWrapper.FieldCount - 1] += $" AS {aliasName}";
                    }
                }
        /// <summary>
        /// Select
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql打包对象</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Select(MemberExpression expression, SqlWrapper sqlWrapper)
        {
            var type = expression.Expression.Type != expression.Member.DeclaringType ?
                       expression.Expression.Type :
                       expression.Member.DeclaringType;

            var tableName = sqlWrapper.GetTableName(type);

            var parameter = expression.Expression as ParameterExpression;

            sqlWrapper.SetTableAlias(tableName, parameter?.Name);
            string tableAlias = sqlWrapper.GetTableAlias(tableName, parameter?.Name);

            if (!tableAlias.IsNullOrEmpty())
            {
                tableAlias += ".";
            }

            sqlWrapper.AddField(tableAlias + sqlWrapper.GetColumnInfo(expression.Member.DeclaringType, expression.Member).columnName);

            return(sqlWrapper);
        }
        /// <summary>
        /// Insert
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql包装器</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Insert(MemberExpression expression, SqlWrapper sqlWrapper)
        {
            var objectArray = new List <object>();
            var fields      = new List <string>();
            var convertRes  = expression.ToObject();

            if (convertRes.IsNull())
            {
                return(sqlWrapper);
            }

            if (!convertRes.GetType().IsDictionaryType() &&
                convertRes is IEnumerable collection)
            {
                foreach (var item in collection)
                {
                    objectArray.Add(item);
                }
            }
            else
            {
                objectArray.Add(convertRes);
            }

            for (var i = 0; i < objectArray.Count; i++)
            {
                if (sqlWrapper.DatabaseType != DatabaseType.Oracle)
                {
                    sqlWrapper.Append("(");
                }

                if (i > 0 && sqlWrapper.DatabaseType == DatabaseType.Oracle)
                {
                    sqlWrapper.Append(" UNION ALL SELECT ");
                }

                var objectType       = objectArray[i]?.GetType();
                var isDictionaryType = objectType.IsDictionaryType();

                PropertyInfo[] properties;
                IDictionary <string, object> objectDic = null;

                if (!isDictionaryType)
                {
                    properties = objectType?.GetProperties();
                }
                else
                {
                    properties = sqlWrapper.DefaultType.GetProperties();
                    objectDic  = objectArray[i] as IDictionary <string, object>;
                }

                foreach (var property in properties)
                {
                    if (isDictionaryType && !objectDic.Any(x => x.Key.EqualIgnoreCase(property.Name)))
                    {
                        continue;
                    }

                    var type = property.DeclaringType.IsAnonymousType() || isDictionaryType ?
                               sqlWrapper.DefaultType :
                               property.DeclaringType;

                    var columnInfo = sqlWrapper.GetColumnInfo(type, property);
                    if (columnInfo.IsInsert)
                    {
                        object value;

                        if (isDictionaryType)
                        {
                            value = objectDic.FirstOrDefault(x => x.Key.EqualIgnoreCase(property.Name)).Value;
                        }
                        else
                        {
                            value = property.GetValue(objectArray[i], null);
                        }

                        if (value != null || (sqlWrapper.IsEnableNullValue && value == null))
                        {
                            sqlWrapper.AddDbParameter(value, columnInfo.DataType);

                            if (!fields.Contains(columnInfo.ColumnName))
                            {
                                fields.Add(columnInfo.ColumnName);
                            }

                            sqlWrapper += ",";
                        }
                    }
                }

                if (sqlWrapper[sqlWrapper.Length - 1] == ',')
                {
                    sqlWrapper.Remove(sqlWrapper.Length - 1, 1);
                    if (sqlWrapper.DatabaseType != DatabaseType.Oracle)
                    {
                        sqlWrapper.Append("),");
                    }
                    else
                    {
                        sqlWrapper.Append(" FROM DUAL");
                    }
                }
            }

            sqlWrapper.RemoveLast(',');

            sqlWrapper.Reset(string.Format(sqlWrapper.ToString(), string.Join(",", fields).TrimEnd(',')));

            return(sqlWrapper);
        }
        /// <summary>
        /// Insert
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql包装器</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Insert(ListInitExpression expression, SqlWrapper sqlWrapper)
        {
            if (expression.ToObject() is IEnumerable collection)
            {
                var i      = 0;
                var fields = new List <string>();

                foreach (var item in collection)
                {
                    if (sqlWrapper.DatabaseType != DatabaseType.Oracle)
                    {
                        sqlWrapper.Append("(");
                    }

                    if (i > 0 && sqlWrapper.DatabaseType == DatabaseType.Oracle)
                    {
                        sqlWrapper.Append(" UNION ALL SELECT ");
                    }

                    var properties = item?.GetType().GetProperties();
                    foreach (var p in properties)
                    {
                        var type = p.DeclaringType.IsAnonymousType() ?
                                   sqlWrapper.DefaultType :
                                   p.DeclaringType;

                        var columnInfo = sqlWrapper.GetColumnInfo(type, p);
                        if (columnInfo.IsInsert)
                        {
                            var value = p.GetValue(item, null);
                            if (value != null || (sqlWrapper.IsEnableNullValue && value == null))
                            {
                                sqlWrapper.AddDbParameter(value, columnInfo.DataType);
                                if (!fields.Contains(columnInfo.ColumnName))
                                {
                                    fields.Add(columnInfo.ColumnName);
                                }
                                sqlWrapper += ",";
                            }
                        }
                    }

                    if (sqlWrapper[sqlWrapper.Length - 1] == ',')
                    {
                        sqlWrapper.Remove(sqlWrapper.Length - 1, 1);
                        if (sqlWrapper.DatabaseType != DatabaseType.Oracle)
                        {
                            sqlWrapper.Append("),");
                        }
                        else
                        {
                            sqlWrapper.Append(" FROM DUAL");
                        }
                    }

                    i++;
                }

                sqlWrapper.RemoveLast(',');

                sqlWrapper.Reset(string.Format(sqlWrapper.ToString(), string.Join(",", fields).TrimEnd(',')));
            }

            return(sqlWrapper);
        }
        /// <summary>
        /// Update
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql包装器</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Update(MemberExpression expression, SqlWrapper sqlWrapper)
        {
            var convertRes = expression.ToObject();

            if (convertRes.IsNull())
            {
                return(sqlWrapper);
            }

            var convertType      = convertRes?.GetType();
            var isDictionaryType = convertType.IsDictionaryType();

            PropertyInfo[] properties;
            IDictionary <string, object> convertDic = null;

            if (!isDictionaryType)
            {
                properties = convertType?.GetProperties();
            }
            else
            {
                properties = sqlWrapper.DefaultType.GetProperties();
                convertDic = convertRes as IDictionary <string, object>;
            }

            if (properties.IsNotNullOrEmpty())
            {
                foreach (var item in properties)
                {
                    if (isDictionaryType && !convertDic.Any(x => x.Key.EqualIgnoreCase(item.Name)))
                    {
                        continue;
                    }

                    var type = item.DeclaringType.IsAnonymousType() || isDictionaryType ?
                               sqlWrapper.DefaultType :
                               item.DeclaringType;

                    var columnInfo = sqlWrapper.GetColumnInfo(type, item);
                    if (columnInfo.IsUpdate)
                    {
                        object value;

                        if (isDictionaryType)
                        {
                            value = convertDic.FirstOrDefault(x => x.Key.EqualIgnoreCase(item.Name)).Value;
                        }
                        else
                        {
                            value = item.GetValue(convertRes, null);
                        }

                        if (value != null || (sqlWrapper.IsEnableNullValue && value == null))
                        {
                            sqlWrapper += columnInfo.ColumnName + " = ";
                            sqlWrapper.AddDbParameter(value, columnInfo.DataType);
                            sqlWrapper += ",";
                        }
                    }
                }
            }

            sqlWrapper.RemoveLast(',');

            return(sqlWrapper);
        }
        /// <summary>
        /// OrderBy
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql打包对象</param>
        /// <param name="orders">排序方式</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper OrderBy(MemberExpression expression, SqlWrapper sqlWrapper, params OrderType[] orders)
        {
            var tableAlias = string.Empty;
            var tableName  = string.Empty;

            if (expression.Expression.NodeType == ExpressionType.Parameter)
            {
                var type = expression.Expression.Type != expression.Member.DeclaringType ?
                           expression.Expression.Type :
                           expression.Member.DeclaringType;
                tableName = sqlWrapper.GetTableName(type);
            }

            if (expression.Expression.NodeType == ExpressionType.Constant)
            {
                tableName = sqlWrapper.GetTableName(sqlWrapper.DefaultType);
            }

            tableAlias = sqlWrapper.GetTableAlias(tableName, tableAlias);

            if (!tableAlias.IsNullOrEmpty())
            {
                tableAlias += ".";
            }

            if (expression.Expression.NodeType == ExpressionType.Parameter)
            {
                sqlWrapper += tableAlias + sqlWrapper.GetColumnInfo(expression.Member.DeclaringType, expression.Member).columnName;
                if (orders?.Length > 0)
                {
                    sqlWrapper += $" { (orders[0] == OrderType.Descending ? "DESC" : "ASC")}";
                }
            }

            if (expression.Expression.NodeType == ExpressionType.Constant)
            {
                var obj = expression.ToObject();
                if (obj != null)
                {
                    var type = obj.GetType().Name;

                    if (type == "String[]" && obj is string[] array)
                    {
                        for (var i = 0; i < array.Length; i++)
                        {
                            SqlExpressionProvider.OrderBy(Expression.Constant(array[i], array[i].GetType()), sqlWrapper);

                            if (i <= orders.Length - 1)
                            {
                                sqlWrapper += $" { (orders[i] == OrderType.Descending ? "DESC" : "ASC")},";
                            }
                            else if (!array[i].ToUpper().Contains("ASC") && !array[i].ToUpper().Contains("DESC"))
                            {
                                sqlWrapper += " ASC,";
                            }
                            else
                            {
                                sqlWrapper += ",";
                            }
                        }
                        sqlWrapper.Remove(sqlWrapper.Length - 1, 1);
                    }

                    if (type == "List`1" && obj is List <string> list)
                    {
                        for (var i = 0; i < list.Count; i++)
                        {
                            SqlExpressionProvider.OrderBy(Expression.Constant(list[i], list[i].GetType()), sqlWrapper);

                            if (i <= orders.Length - 1)
                            {
                                sqlWrapper += $" { (orders[i] == OrderType.Descending ? "DESC" : "ASC")},";
                            }
                            else if (!list[i].ToUpper().Contains("ASC") && !list[i].ToUpper().Contains("DESC"))
                            {
                                sqlWrapper += " ASC,";
                            }
                            else
                            {
                                sqlWrapper += ",";
                            }
                        }
                        sqlWrapper.Remove(sqlWrapper.Length - 1, 1);
                    }

                    if (type == "String" && obj is string str)
                    {
                        SqlExpressionProvider.OrderBy(Expression.Constant(str, str.GetType()), sqlWrapper);
                        str = str.ToUpper();
                        if (!str.Contains("ASC") && !str.Contains("DESC"))
                        {
                            if (orders.Length >= 1)
                            {
                                sqlWrapper += $" { (orders[0] == OrderType.Descending ? "DESC" : "ASC")},";
                            }
                            else
                            {
                                sqlWrapper += " ASC,";
                            }

                            sqlWrapper.Remove(sqlWrapper.Length - 1, 1);
                        }
                    }
                }
            }

            return(sqlWrapper);
        }
        /// <summary>
        /// Insert
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql打包对象</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Insert(MemberExpression expression, SqlWrapper sqlWrapper)
        {
            var objectArray = new List <object>();
            var fields      = new List <string>();
            var obj         = expression.ToObject();

            if (obj.GetType().IsArray)
            {
                objectArray.AddRange(obj as object[]);
            }
            else if (obj.GetType().Name == "List`1")
            {
                objectArray.AddRange(obj as IEnumerable <object>);
            }
            else
            {
                objectArray.Add(obj);
            }

            for (var i = 0; i < objectArray.Count; i++)
            {
                if (sqlWrapper.DatabaseType != DatabaseType.Oracle)
                {
                    sqlWrapper.Append("(");
                }

                if (i > 0 && sqlWrapper.DatabaseType == DatabaseType.Oracle)
                {
                    sqlWrapper.Append(" UNION ALL SELECT ");
                }

                var properties = objectArray[i]?.GetType().GetProperties();
                foreach (var p in properties)
                {
                    var type = p.DeclaringType.ToString().Contains("AnonymousType") ?
                               sqlWrapper.DefaultType :
                               p.DeclaringType;

                    var(columnName, isInsert, isUpdate) = sqlWrapper.GetColumnInfo(type, p);
                    if (isInsert)
                    {
                        var value = p.GetValue(objectArray[i], null);
                        if (value != null || (sqlWrapper.IsEnableNullValue && value == null))
                        {
                            sqlWrapper.AddDbParameter(value);
                            if (!fields.Contains(columnName))
                            {
                                fields.Add(columnName);
                            }
                            sqlWrapper += ",";
                        }
                    }
                }

                if (sqlWrapper[sqlWrapper.Length - 1] == ',')
                {
                    sqlWrapper.Remove(sqlWrapper.Length - 1, 1);
                    if (sqlWrapper.DatabaseType != DatabaseType.Oracle)
                    {
                        sqlWrapper.Append("),");
                    }
                    else
                    {
                        sqlWrapper.Append(" FROM DUAL");
                    }
                }
            }

            if (sqlWrapper[sqlWrapper.Length - 1] == ',')
            {
                sqlWrapper.Remove(sqlWrapper.Length - 1, 1);
            }

            sqlWrapper.Reset(string.Format(sqlWrapper.ToString(), string.Join(",", fields).TrimEnd(',')));

            return(sqlWrapper);
        }
        /// <summary>
        /// GroupBy
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql打包对象</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper GroupBy(MemberExpression expression, SqlWrapper sqlWrapper)
        {
            var tableAlias = string.Empty;
            var tableName  = string.Empty;

            if (expression.Expression.NodeType == ExpressionType.Parameter)
            {
                var type = expression.Expression.Type != expression.Member.DeclaringType ?
                           expression.Expression.Type :
                           expression.Member.DeclaringType;
                tableName  = sqlWrapper.GetTableName(type);
                tableAlias = (expression.Expression as ParameterExpression)?.Name;
            }

            if (expression.Expression.NodeType == ExpressionType.Constant)
            {
                tableName = sqlWrapper.GetTableName(sqlWrapper.DefaultType);
            }

            tableAlias = sqlWrapper.GetTableAlias(tableName, tableAlias);

            if (!tableAlias.IsNullOrEmpty())
            {
                tableAlias += ".";
            }

            if (expression.Expression.NodeType == ExpressionType.Parameter)
            {
                sqlWrapper += tableAlias + sqlWrapper.GetColumnInfo(expression.Member.DeclaringType, expression.Member).columnName;
            }

            if (expression.Expression.NodeType == ExpressionType.Constant)
            {
                var obj = expression.ToObject();
                if (obj != null)
                {
                    var type = obj.GetType().Name;

                    if (type == "String[]" && obj is string[] array)
                    {
                        foreach (var item in array)
                        {
                            SqlExpressionProvider.GroupBy(Expression.Constant(item, item.GetType()), sqlWrapper);
                        }
                        sqlWrapper.Remove(sqlWrapper.Length - 1, 1);
                    }

                    if (type == "List`1" && obj is List <string> list)
                    {
                        foreach (var item in list)
                        {
                            SqlExpressionProvider.GroupBy(Expression.Constant(item, item.GetType()), sqlWrapper);
                        }
                        sqlWrapper.Remove(sqlWrapper.Length - 1, 1);
                    }

                    if (type == "String" && obj is string str)
                    {
                        SqlExpressionProvider.GroupBy(Expression.Constant(str, str.GetType()), sqlWrapper);
                        sqlWrapper.Remove(sqlWrapper.Length - 1, 1);
                    }
                }
            }

            return(sqlWrapper);
        }