/// <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> /// 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); }
/// <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); }
/// <summary> /// Having /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql打包对象</param> /// <returns>SqlWrapper</returns> public override SqlWrapper Having(MethodCallExpression expression, SqlWrapper sqlWrapper) { var key = expression.Method; if (key.IsGenericMethod) { key = key.GetGenericMethodDefinition(); } //匹配到方法 if (methods.TryGetValue(key.Name, out Action <MethodCallExpression, SqlWrapper> handler)) { handler(expression, sqlWrapper); return(sqlWrapper); } else { try { sqlWrapper.AddDbParameter(expression.ToObject()); return(sqlWrapper); } catch { throw new NotImplementedException("无法解析方法" + expression.Method); } } }
/// <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> /// 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(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> /// Having /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql包装器</param> /// <returns>SqlWrapper</returns> public override SqlWrapper Having(ConstantExpression expression, SqlWrapper sqlWrapper) { //表达式左侧为bool类型常量 if (expression.NodeType == ExpressionType.Constant && expression.Value is bool res) { if (!res && sqlWrapper.EndsWith("AND", "OR")) { sqlWrapper += " 1 = 0 "; } } else { sqlWrapper.AddDbParameter(expression.Value); } 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()); } }
/// <summary> /// Join /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql打包对象</param> /// <returns>SqlWrapper</returns> public override SqlWrapper Join(ConstantExpression expression, SqlWrapper sqlWrapper) { //表达式左侧为bool类型常量 if (expression.NodeType == ExpressionType.Constant && expression.Value is bool b) { var sql = sqlWrapper.ToString().ToUpper().Trim(); if (!b && (sql.EndsWith("AND") || sql.EndsWith("OR"))) { sqlWrapper += " 1 = 0 "; } } else { sqlWrapper.AddDbParameter(expression.Value); } return(sqlWrapper); }
/// <summary> /// Where /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql包装器</param> /// <returns>SqlWrapper</returns> public override SqlWrapper Where(UnaryExpression expression, SqlWrapper sqlWrapper) { var startIndex = sqlWrapper.Length; if (new[] { ExpressionType.ArrayLength, ExpressionType.ArrayIndex }.Contains(expression.NodeType)) { sqlWrapper.AddDbParameter(expression.ToObject()); } else { SqlExpressionProvider.Where(expression.Operand, sqlWrapper); //取非解析 ExpressionNotResolver(expression, sqlWrapper, startIndex); } 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> /// In /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql打包对象</param> /// <returns>SqlWrapper</returns> public override SqlWrapper In(ConstantExpression expression, SqlWrapper sqlWrapper) { sqlWrapper.AddDbParameter(expression.Value); 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> /// 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> /// 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> /// 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); }