Пример #1
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);
        }
Пример #2
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>
        /// 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>
        /// 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>
        /// 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(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);
        }
Пример #7
0
        /// <summary>
        /// Expression嵌套解析
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql包装器</param>
        /// <param name="method">方法名,可选值:Join、Having、Where</param>
        public static int ExpressionNestedResolver(BinaryExpression expression, SqlWrapper sqlWrapper, string method)
        {
            //左侧嵌套
            var lExpr = expression.Left as BinaryExpression;

            var llIsBinaryExpr = lExpr?.Left is BinaryExpression;
            var llIsBoolMethod = typeof(bool) == (lExpr?.Left as MethodCallExpression)?.Method.ReturnType;

            var lrIsBinaryExpr = lExpr?.Right is BinaryExpression;
            var lrIsBoolMethod = typeof(bool) == (lExpr?.Right as MethodCallExpression)?.Method.ReturnType;

            var lNested = (llIsBinaryExpr || llIsBoolMethod) && (lrIsBinaryExpr || lrIsBoolMethod);

            if (lNested)
            {
                sqlWrapper.Append("(");
            }

            if (method.EqualIgnoreCase(nameof(Join)))
            {
                SqlExpressionProvider.Join(expression.Left, sqlWrapper);
            }

            else if (method.EqualIgnoreCase(nameof(Having)))
            {
                SqlExpressionProvider.Having(expression.Left, sqlWrapper);
            }

            else
            {
                SqlExpressionProvider.Where(expression.Left, sqlWrapper);
            }

            if (lNested)
            {
                sqlWrapper.Append(")");
            }

            var operatorIndex = sqlWrapper.Length;

            //右侧嵌套
            var rExpr = expression.Right as BinaryExpression;

            var rlIsBinaryExpr = rExpr?.Left is BinaryExpression;
            var rlIsBoolMethod = typeof(bool) == (rExpr?.Left as MethodCallExpression)?.Method.ReturnType;

            var rrIsBinaryExpr = rExpr?.Right is BinaryExpression;
            var rrIsBoolMethod = typeof(bool) == (rExpr?.Right as MethodCallExpression)?.Method.ReturnType;

            var rNested = (rlIsBinaryExpr || rlIsBoolMethod) && (rrIsBinaryExpr || rrIsBoolMethod);

            if (rNested)
            {
                sqlWrapper.Append("(");
            }

            if (method.EqualIgnoreCase(nameof(Having)))
            {
                SqlExpressionProvider.Having(expression.Right, sqlWrapper);
            }

            else
            {
                SqlExpressionProvider.Where(expression.Right, sqlWrapper);
            }

            if (rNested)
            {
                sqlWrapper.Append(")");
            }

            return(operatorIndex);
        }
        /// <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);
        }