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