public static Exception ( bool isException, string message ) : void | ||
isException | bool | true则引发异常 |
message | string | 错误信息 |
return | void |
public IDeleteable<T> Where(T deleteObj) { Check.Exception(GetPrimaryKeys().IsNullOrEmpty(), "Where(entity) Primary key required"); Where(new List<T>() { deleteObj }); return this; }
public SubResolve(MethodCallExpression expression, ExpressionContext context, Expression oppsiteExpression) { this.context = context; var currentExpression = expression; allMethods.Add(currentExpression); if (context.IsSingle && oppsiteExpression != null && oppsiteExpression is MemberExpression) { var childExpression = (oppsiteExpression as MemberExpression).Expression; if (childExpression is ParameterExpression) { this.context.SingleTableNameSubqueryShortName = (childExpression as ParameterExpression).Name; } else { this.context.SingleTableNameSubqueryShortName = (context.Expression as LambdaExpression).Parameters.First().Name; } } else if (context.IsSingle) { if (context.Expression is LambdaExpression) { this.context.SingleTableNameSubqueryShortName = (context.Expression as LambdaExpression).Parameters.First().Name; } else if (context.Expression is MethodCallExpression) { var expArgs = ((context.Expression as MethodCallExpression).Object as MethodCallExpression).Arguments; if (expArgs != null && expArgs.Any()) { var meExp = expArgs[0] as LambdaExpression; var selfParameterName = meExp.Parameters.First().Name; context.SingleTableNameSubqueryShortName = (((meExp.Body as BinaryExpression).Left as MemberExpression).Expression as ParameterExpression).Name; if (context.SingleTableNameSubqueryShortName == selfParameterName) { context.SingleTableNameSubqueryShortName = (((meExp.Body as BinaryExpression).Right as MemberExpression).Expression as ParameterExpression).Name; } } } else if (context.Expression.GetType().Name == "MethodBinaryExpression") { var subExp = (context.Expression as BinaryExpression).Left is MethodCallExpression ? (context.Expression as BinaryExpression).Left : (context.Expression as BinaryExpression).Right; var meExp = ((subExp as MethodCallExpression).Object as MethodCallExpression).Arguments[0] as LambdaExpression; var selfParameterName = meExp.Parameters.First().Name; context.SingleTableNameSubqueryShortName = (((meExp.Body as BinaryExpression).Left as MemberExpression).Expression as ParameterExpression).Name; if (context.SingleTableNameSubqueryShortName == selfParameterName) { context.SingleTableNameSubqueryShortName = (((meExp.Body as BinaryExpression).Right as MemberExpression).Expression as ParameterExpression).Name; } } else if (context.RootExpression != null && context.Expression.GetType().Name == "SimpleBinaryExpression") { var name = (this.context.RootExpression as LambdaExpression).Parameters[0].Name; context.SingleTableNameSubqueryShortName = name; } else { Check.Exception(true, "I'm sorry I can't parse the current expression"); } } var subIndex = this.context.SubQueryIndex; while (currentExpression != null) { var addItem = currentExpression.Object as MethodCallExpression; if (addItem != null) { allMethods.Add(addItem); } if (subIndex == this.context.SubQueryIndex && addItem != null && addItem.Arguments.HasValue() && addItem.Arguments.Any(it => it.ToString().Contains("Subqueryable()"))) { this.context.SubQueryIndex++; } currentExpression = addItem; } }
public IDeleteable <T> Where(List <T> deleteObjs) { if (deleteObjs == null || deleteObjs.Count() == 0) { Where(SqlBuilder.SqlFalse); return(this); } string tableName = this.Context.EntityMaintenance.GetTableName <T>(); var primaryFields = this.GetPrimaryKeys(); var isSinglePrimaryKey = primaryFields.Count == 1; Check.Exception(primaryFields.IsNullOrEmpty(), string.Format("Table {0} with no primarykey", tableName)); if (isSinglePrimaryKey) { List <object> primaryKeyValues = new List <object>(); var primaryField = primaryFields.Single(); foreach (var deleteObj in deleteObjs) { var entityPropertyName = this.Context.EntityMaintenance.GetPropertyName <T>(primaryField); var columnInfo = EntityInfo.Columns.Single(it => it.PropertyName.Equals(entityPropertyName, StringComparison.CurrentCultureIgnoreCase)); var value = columnInfo.PropertyInfo.GetValue(deleteObj, null); primaryKeyValues.Add(value); } if (primaryKeyValues.Count < 10000) { var inValueString = primaryKeyValues.ToArray().ToJoinSqlInVals(); Where(string.Format(DeleteBuilder.WhereInTemplate, SqlBuilder.GetTranslationColumnName(primaryFields.Single()), inValueString)); } else { if (DeleteBuilder.BigDataInValues == null) { DeleteBuilder.BigDataInValues = new List <object>(); } DeleteBuilder.BigDataInValues.AddRange(primaryKeyValues); DeleteBuilder.BigDataFiled = primaryField; } } else { StringBuilder whereInSql = new StringBuilder(); foreach (var deleteObj in deleteObjs) { StringBuilder orString = new StringBuilder(); var isFirst = deleteObjs.IndexOf(deleteObj) == 0; if (!isFirst) { orString.Append(DeleteBuilder.WhereInOrTemplate + UtilConstants.Space); } int i = 0; StringBuilder andString = new StringBuilder(); foreach (var primaryField in primaryFields) { if (i != 0) { andString.Append(DeleteBuilder.WhereInAndTemplate + UtilConstants.Space); } var entityPropertyName = this.Context.EntityMaintenance.GetPropertyName <T>(primaryField); var columnInfo = EntityInfo.Columns.Single(it => it.PropertyName == entityPropertyName); var entityValue = columnInfo.PropertyInfo.GetValue(deleteObj, null); if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle) { andString.AppendFormat(DeleteBuilder.WhereInEqualTemplate, primaryField.ToUpper(), entityValue); } else { andString.AppendFormat(DeleteBuilder.WhereInEqualTemplate, primaryField, entityValue); } ++i; } orString.AppendFormat(DeleteBuilder.WhereInAreaTemplate, andString); whereInSql.Append(orString); } Where(string.Format(DeleteBuilder.WhereInAreaTemplate, whereInSql.ToString())); } return(this); }
/// <summary> /// Reader转成T的集合 /// </summary> /// <typeparam name="TResult"></typeparam> /// <param name="dr"></param> /// <param name="isClose"></param> /// <returns></returns> internal static List <T> DataReaderToList <T>(Type type, IDataReader dr, string fields, bool isClose = true, bool isTry = true) { if (type.Name.Contains("KeyValuePair")) { List <T> strReval = new List <T>(); FillValueTypeToDictionary(type, dr, strReval); return(strReval); } //值类型 else if (type.GetTypeInfo().IsValueType || type == SqlSugarTool.StringType) { List <T> strReval = new List <T>(); FillValueTypeToDr <T>(type, dr, strReval); return(strReval); } //数组类型 else if (type.IsArray) { List <T> strReval = new List <T>(); FillValueTypeToArray(type, dr, strReval); return(strReval); } var cacheManager = CacheManager <IDataReaderEntityBuilder <T> > .GetInstance(); string key = "DataReaderToList." + fields + type.FullName; IDataReaderEntityBuilder <T> eblist = null; if (cacheManager.ContainsKey(key)) { eblist = cacheManager[key]; } else { eblist = IDataReaderEntityBuilder <T> .CreateBuilder(type, dr); cacheManager.Add(key, eblist, cacheManager.Day); } List <T> list = new List <T>(); try { if (dr == null) { return(list); } while (dr.Read()) { list.Add(eblist.Build(dr)); } if (isClose) { dr.Close(); dr.Dispose(); dr = null; } } catch (Exception ex) { if (isClose) { dr.Close(); dr.Dispose(); dr = null; } Check.Exception(true, "错误信息:实体映射出错。\r\n错误详情:{0}", ex.Message); } return(list); }
private List <DiffLogTableInfo> GetDiffTable(string sql, long?identity) { List <SugarParameter> parameters = new List <SugarParameter>(); List <DiffLogTableInfo> result = new List <DiffLogTableInfo>(); var whereSql = string.Empty; List <IConditionalModel> cons = new List <IConditionalModel>(); if (identity != null && identity > 0 && GetIdentityKeys().HasValue()) { var fieldName = GetIdentityKeys().Last(); cons.Add(new ConditionalModel() { ConditionalType = ConditionalType.Equal, FieldName = fieldName, FieldValue = identity.ToString() }); } else { foreach (var item in this.EntityInfo.Columns.Where(it => it.IsIgnore == false && GetPrimaryKeys().Any(pk => pk.Equals(it.DbColumnName, StringComparison.CurrentCultureIgnoreCase)))) { var fielddName = item.DbColumnName; var fieldValue = this.EntityInfo.Columns.FirstOrDefault(it => it.PropertyName == item.PropertyName).PropertyInfo.GetValue(this.InsertObjs.Last(), null).ObjToString(); cons.Add(new ConditionalModel() { ConditionalType = ConditionalType.Equal, FieldName = fielddName, FieldValue = fieldValue }); } } Check.Exception(cons.IsNullOrEmpty(), "Insertable.EnableDiffLogEvent need primary key"); var sqlable = this.SqlBuilder.ConditionalModelToSql(cons); whereSql = sqlable.Key; parameters.AddRange(sqlable.Value); var dt = this.Context.Queryable <T>().Where(whereSql).AddParameters(parameters).ToDataTable(); if (dt.Rows != null && dt.Rows.Count > 0) { foreach (DataRow row in dt.Rows) { DiffLogTableInfo item = new DiffLogTableInfo(); item.TableDescription = this.EntityInfo.TableDescription; item.TableName = this.EntityInfo.DbTableName; item.Columns = new List <DiffLogColumnInfo>(); foreach (DataColumn col in dt.Columns) { DiffLogColumnInfo addItem = new DiffLogColumnInfo(); addItem.Value = row[col.ColumnName]; addItem.ColumnName = col.ColumnName; addItem.ColumnDescription = this.EntityInfo.Columns.First(it => it.DbColumnName.Equals(col.ColumnName, StringComparison.CurrentCultureIgnoreCase)).ColumnDescription; item.Columns.Add(addItem); } result.Add(item); } return(result); } else { DiffLogTableInfo diffTable = new DiffLogTableInfo(); diffTable.TableName = this.EntityInfo.DbTableName; diffTable.TableDescription = this.EntityInfo.TableDescription; diffTable.Columns = this.EntityInfo.Columns.Where(it => it.IsIgnore == false).Select(it => new DiffLogColumnInfo() { ColumnDescription = it.ColumnDescription, ColumnName = it.DbColumnName, Value = it.PropertyInfo.GetValue(this.InsertObjs.Last(), null) }).ToList(); return(new List <DiffLogTableInfo>() { diffTable }); } }
public SqlSugarClient(ConnectionConfig config) { Check.Exception(config == null, "ConnectionConfig config is null"); InitContext(config); }
private object GetMethodValue(string name, MethodCallExpressionModel model) { if (IsExtMethod(name)) { model.Expression = this.Expression; DbType type = DbType.SqlServer; if (this.Context is SqlServerExpressionContext) { type = DbType.SqlServer; } else if (this.Context is MySqlExpressionContext) { type = DbType.MySql; } else if (this.Context is SqliteExpressionContext) { type = DbType.Sqlite; } else if (this.Context is OracleExpressionContext) { type = DbType.Oracle; } return(this.Context.SqlFuncServices.First(it => it.UniqueMethodName == name).MethodValue(model, type, this.Context)); } else { if (name == "Parse" && TempParseType.IsIn(UtilConstants.GuidType) && model.Args != null && model.Args.Count() > 1) { name = "Equals"; } else if (name == "Parse") { name = "To" + TempParseType.Name; } switch (name) { case "IIF": return(this.Context.DbMehtods.IIF(model)); case "HasNumber": return(this.Context.DbMehtods.HasNumber(model)); case "HasValue": return(this.Context.DbMehtods.HasValue(model)); case "IsNullOrEmpty": return(this.Context.DbMehtods.IsNullOrEmpty(model)); case "ToLower": return(this.Context.DbMehtods.ToLower(model)); case "ToUpper": return(this.Context.DbMehtods.ToUpper(model)); case "Trim": return(this.Context.DbMehtods.Trim(model)); case "Contains": return(this.Context.DbMehtods.Contains(model)); case "ContainsArray": if (model.Args[0].MemberValue == null) { var first = this.Context.Parameters.FirstOrDefault(it => it.ParameterName == model.Args[0].MemberName.ObjToString()); if (first.HasValue()) { model.Args[0].MemberValue = first.Value; } } var caResult = this.Context.DbMehtods.ContainsArray(model); this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[0].MemberName.ObjToString()); return(caResult); case "ContainsArrayUseSqlParameters": if (model.Args[0].MemberValue == null) { var first = this.Context.Parameters.FirstOrDefault(it => it.ParameterName == model.Args[0].MemberName.ObjToString()); if (first.HasValue()) { model.Args[0].MemberValue = first.Value; } } model.Data = this.Context.SqlParameterKeyWord + "INP_" + this.Context.ParameterIndex; this.Context.ParameterIndex++; if (model.Args[0].MemberValue.HasValue()) { var inValueIEnumerable = (IEnumerable)model.Args[0].MemberValue; int i = 0; foreach (var item in inValueIEnumerable) { this.Context.Parameters.Add(new SugarParameter(model.Data + "_" + i, item)); i++; } } var caResult2 = this.Context.DbMehtods.ContainsArrayUseSqlParameters(model); this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[0].MemberName.ObjToString()); return(caResult2); case "Equals": return(this.Context.DbMehtods.Equals(model)); case "DateIsSame": if (model.Args.Count == 2) { return(this.Context.DbMehtods.DateIsSameDay(model)); } else { var dsResult = this.Context.DbMehtods.DateIsSameByType(model); this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[2].MemberName.ObjToString()); return(dsResult); } case "DateAdd": if (model.Args.Count == 2) { return(this.Context.DbMehtods.DateAddDay(model)); } else { var daResult = this.Context.DbMehtods.DateAddByType(model); this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[2].MemberName.ObjToString()); return(daResult); } case "DateValue": var dvResult = this.Context.DbMehtods.DateValue(model); this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[1].MemberName.ObjToString()); return(dvResult); case "Between": return(this.Context.DbMehtods.Between(model)); case "StartsWith": return(this.Context.DbMehtods.StartsWith(model)); case "EndsWith": return(this.Context.DbMehtods.EndsWith(model)); case "ToInt32": return(this.Context.DbMehtods.ToInt32(model)); case "ToInt64": return(this.Context.DbMehtods.ToInt64(model)); case "ToDate": return(this.Context.DbMehtods.ToDate(model)); case "ToDateTime": return(this.Context.DbMehtods.ToDate(model)); case "ToTime": return(this.Context.DbMehtods.ToTime(model)); case "ToString": if (model.Args.Count > 1 && model.Args.Last().MemberValue.ObjToString().IsContainsIn("-", "/", ":", "yy", "ms", "hh")) { return(GeDateFormat(model.Args.Last().MemberValue.ObjToString(), model.Args.First().MemberName.ObjToString())); } Check.Exception(model.Args.Count > 1, "ToString (Format) is not supported, Use ToString().If time formatting can be used it.Date.Year+\"-\"+it.Data.Month+\"-\"+it.Date.Day "); return(this.Context.DbMehtods.ToString(model)); case "ToVarchar": return(this.Context.DbMehtods.ToVarchar(model)); case "ToDecimal": return(this.Context.DbMehtods.ToDecimal(model)); case "ToGuid": return(this.Context.DbMehtods.ToGuid(model)); case "ToDouble": return(this.Context.DbMehtods.ToDouble(model)); case "ToBool": return(this.Context.DbMehtods.ToBool(model)); case "ToBoolean": return(this.Context.DbMehtods.ToBool(model)); case "Substring": return(this.Context.DbMehtods.Substring(model)); case "Replace": return(this.Context.DbMehtods.Replace(model)); case "Length": return(this.Context.DbMehtods.Length(model)); case "AggregateSum": return(this.Context.DbMehtods.AggregateSum(model)); case "AggregateAvg": return(this.Context.DbMehtods.AggregateAvg(model)); case "AggregateMin": return(this.Context.DbMehtods.AggregateMin(model)); case "AggregateMax": return(this.Context.DbMehtods.AggregateMax(model)); case "AggregateCount": return(this.Context.DbMehtods.AggregateCount(model)); case "AggregateDistinctCount": return(this.Context.DbMehtods.AggregateDistinctCount(model)); case "MappingColumn": var mappingColumnResult = this.Context.DbMehtods.MappingColumn(model); var isValid = model.Args[0].IsMember && model.Args[1].IsMember == false; Check.Exception(!isValid, "SqlFunc.MappingColumn parameters error, The property name on the left, string value on the right"); this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[1].MemberName.ObjToString()); return(mappingColumnResult); case "IsNull": return(this.Context.DbMehtods.IsNull(model)); case "MergeString": return(this.Context.DbMehtods.MergeString(model.Args.Select(it => it.MemberName.ObjToString()).ToArray())); case "GetSelfAndAutoFill": this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[0].MemberName.ObjToString()); return(this.Context.DbMehtods.GetSelfAndAutoFill(model.Args[0].MemberValue.ObjToString(), this.Context.IsSingle)); case "GetDate": return(this.Context.DbMehtods.GetDate()); case "GetRandom": return(this.Context.DbMehtods.GetRandom()); case "CharIndex": return(this.Context.DbMehtods.CharIndex(model)); default: break; } } return(null); }
private void CheckMethod(MethodCallExpression expression) { Check.Exception(expression.Method.ReflectedType().FullName != ExpressionConst.SqlFuncFullName, string.Format(ExpressionErrorMessage.MethodError, expression.Method.Name)); }
private object GetMdthodValue(string name, MethodCallExpressionModel model) { if (IsExtMethod(name)) { DbType type = DbType.SqlServer; if (this.Context is SqlServerExpressionContext) { type = DbType.SqlServer; } else if (this.Context is MySqlExpressionContext) { type = DbType.MySql; } else if (this.Context is SqliteExpressionContext) { type = DbType.Sqlite; } else if (this.Context is OracleExpressionContext) { type = DbType.Oracle; } return(this.Context.SqlFuncServices.First(it => it.UniqueMethodName == name).MethodValue(model, type, this.Context)); } else { switch (name) { case "IIF": return(this.Context.DbMehtods.IIF(model)); case "HasNumber": return(this.Context.DbMehtods.HasNumber(model)); case "HasValue": return(this.Context.DbMehtods.HasValue(model)); case "IsNullOrEmpty": return(this.Context.DbMehtods.IsNullOrEmpty(model)); case "ToLower": return(this.Context.DbMehtods.ToLower(model)); case "ToUpper": return(this.Context.DbMehtods.ToUpper(model)); case "Trim": return(this.Context.DbMehtods.Trim(model)); case "Contains": return(this.Context.DbMehtods.Contains(model)); case "ContainsArray": var caResult = this.Context.DbMehtods.ContainsArray(model); this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[0].MemberName.ObjToString()); return(caResult); case "Equals": return(this.Context.DbMehtods.Equals(model)); case "DateIsSame": if (model.Args.Count == 2) { return(this.Context.DbMehtods.DateIsSameDay(model)); } else { var dsResult = this.Context.DbMehtods.DateIsSameByType(model); this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[2].MemberName.ObjToString()); return(dsResult); } case "DateAdd": if (model.Args.Count == 2) { return(this.Context.DbMehtods.DateAddDay(model)); } else { var daResult = this.Context.DbMehtods.DateAddByType(model); this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[2].MemberName.ObjToString()); return(daResult); } case "DateValue": var dvResult = this.Context.DbMehtods.DateValue(model); this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[1].MemberName.ObjToString()); return(dvResult); case "Between": return(this.Context.DbMehtods.Between(model)); case "StartsWith": return(this.Context.DbMehtods.StartsWith(model)); case "EndsWith": return(this.Context.DbMehtods.EndsWith(model)); case "ToInt32": return(this.Context.DbMehtods.ToInt32(model)); case "ToInt64": return(this.Context.DbMehtods.ToInt64(model)); case "ToDate": return(this.Context.DbMehtods.ToDate(model)); case "ToTime": return(this.Context.DbMehtods.ToTime(model)); case "ToString": Check.Exception(model.Args.Count > 1, "ToString (Format) is not supported, Use ToString().If time formatting can be used it.Date.Year+\"-\"+it.Data.Month+\"-\"+it.Date.Day "); return(this.Context.DbMehtods.ToString(model)); case "ToDecimal": return(this.Context.DbMehtods.ToDecimal(model)); case "ToGuid": return(this.Context.DbMehtods.ToGuid(model)); case "ToDouble": return(this.Context.DbMehtods.ToDouble(model)); case "ToBool": return(this.Context.DbMehtods.ToBool(model)); case "Substring": return(this.Context.DbMehtods.Substring(model)); case "Replace": return(this.Context.DbMehtods.Replace(model)); case "Length": return(this.Context.DbMehtods.Length(model)); case "AggregateSum": return(this.Context.DbMehtods.AggregateSum(model)); case "AggregateAvg": return(this.Context.DbMehtods.AggregateAvg(model)); case "AggregateMin": return(this.Context.DbMehtods.AggregateMin(model)); case "AggregateMax": return(this.Context.DbMehtods.AggregateMax(model)); case "AggregateCount": return(this.Context.DbMehtods.AggregateCount(model)); case "MappingColumn": var mappingColumnResult = this.Context.DbMehtods.MappingColumn(model); var isValid = model.Args[0].IsMember && model.Args[1].IsMember == false; Check.Exception(!isValid, "SqlFunc.MappingColumn parameters error, The property name on the left, string value on the right"); this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[1].MemberName.ObjToString()); return(mappingColumnResult); case "IsNull": return(this.Context.DbMehtods.IsNull(model)); case "MergeString": return(this.Context.DbMehtods.MergeString(model.Args.Select(it => it.MemberName.ObjToString()).ToArray())); case "GetSelfAndAutoFill": this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[0].MemberName.ObjToString()); return(this.Context.DbMehtods.GetSelfAndAutoFill(model.Args[0].MemberValue.ObjToString(), this.Context.IsSingle)); case "GetDate": return(this.Context.DbMehtods.GetDate()); case "GetRandom": return(this.Context.DbMehtods.GetRandom()); default: break; } } return(null); }
public NewExpressionResolve(ExpressionParameter parameter) : base(parameter) { var expression = base.Expression as NewExpression; if (expression.Type.IsIn(UtilConstants.DateType, UtilConstants.GuidType)) { NewValueType(parameter, expression); return; } switch (parameter.Context.ResolveType) { case ResolveExpressType.WhereSingle: Check.ThrowNotSupportedException(expression.ToString()); break; case ResolveExpressType.WhereMultiple: Check.ThrowNotSupportedException(expression.ToString()); break; case ResolveExpressType.SelectSingle: Check.Exception(expression.Type == UtilConstants.DateType, "ThrowNotSupportedException {0} ", expression.ToString()); Select(expression, parameter, true); break; case ResolveExpressType.SelectMultiple: Check.Exception(expression.Type == UtilConstants.DateType, "ThrowNotSupportedException {0} ", expression.ToString()); Select(expression, parameter, false); break; case ResolveExpressType.FieldSingle: Check.ThrowNotSupportedException(expression.ToString()); break; case ResolveExpressType.FieldMultiple: case ResolveExpressType.ArrayMultiple: case ResolveExpressType.ArraySingle: foreach (var item in expression.Arguments) { base.Expression = item; base.Start(); } break; case ResolveExpressType.Join: base.Context.ResolveType = ResolveExpressType.WhereMultiple; int i = 0; foreach (var item in expression.Arguments) { if (item.Type != typeof(JoinType)) { base.Expression = item; base.Start(); } if (item.Type == typeof(JoinType)) { if (i > 0) { base.Context.Result.Append("," + item.ToString() + ","); } else { base.Context.Result.Append(item.ToString() + ","); } ++i; } } break; default: break; } }
private object GetMdthodValue(string name, MethodCallExpressionModel model) { switch (name) { case "IIF": return(this.Context.DbMehtods.IIF(model)); case "HasNumber": return(this.Context.DbMehtods.HasNumber(model)); case "HasValue": return(this.Context.DbMehtods.HasValue(model)); case "IsNullOrEmpty": return(this.Context.DbMehtods.IsNullOrEmpty(model)); case "ToLower": return(this.Context.DbMehtods.ToLower(model)); case "ToUpper": return(this.Context.DbMehtods.ToUpper(model)); case "Trim": return(this.Context.DbMehtods.Trim(model)); case "Contains": return(this.Context.DbMehtods.Contains(model)); case "ContainsArray": var result = this.Context.DbMehtods.ContainsArray(model); this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[0].MemberName.ObjToString()); return(result); case "Equals": return(this.Context.DbMehtods.Equals(model)); case "DateIsSame": if (model.Args.Count == 2) { return(this.Context.DbMehtods.DateIsSameDay(model)); } else { return(this.Context.DbMehtods.DateIsSameByType(model)); } case "DateAdd": if (model.Args.Count == 2) { return(this.Context.DbMehtods.DateAddDay(model)); } else { return(this.Context.DbMehtods.DateAddByType(model)); } case "DateValue": return(this.Context.DbMehtods.DateValue(model)); case "Between": return(this.Context.DbMehtods.Between(model)); case "StartsWith": return(this.Context.DbMehtods.StartsWith(model)); case "EndsWith": return(this.Context.DbMehtods.EndsWith(model)); case "ToInt32": return(this.Context.DbMehtods.ToInt32(model)); case "ToInt64": return(this.Context.DbMehtods.ToInt64(model)); case "ToDate": return(this.Context.DbMehtods.ToDate(model)); case "ToTime": return(this.Context.DbMehtods.ToTime(model)); case "ToString": return(this.Context.DbMehtods.ToString(model)); case "ToDecimal": return(this.Context.DbMehtods.ToDecimal(model)); case "ToGuid": return(this.Context.DbMehtods.ToGuid(model)); case "ToDouble": return(this.Context.DbMehtods.ToDouble(model)); case "ToBool": return(this.Context.DbMehtods.ToBool(model)); case "Substring": return(this.Context.DbMehtods.Substring(model)); case "Replace": return(this.Context.DbMehtods.Replace(model)); case "Length": return(this.Context.DbMehtods.Length(model)); case "AggregateSum": return(this.Context.DbMehtods.AggregateSum(model)); case "AggregateAvg": return(this.Context.DbMehtods.AggregateAvg(model)); case "AggregateMin": return(this.Context.DbMehtods.AggregateMin(model)); case "AggregateMax": return(this.Context.DbMehtods.AggregateMax(model)); case "AggregateCount": return(this.Context.DbMehtods.AggregateCount(model)); case "MappingColumn": var mappingColumnResult = this.Context.DbMehtods.MappingColumn(model); var isValid = model.Args[0].IsMember && model.Args[1].IsMember == false; Check.Exception(!isValid, "SqlFunc.MappingColumn parameters error, The property name on the left, string value on the right"); this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[1].MemberName.ObjToString()); return(mappingColumnResult); case "GetSelfAndAutoFill": this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[0].MemberName.ObjToString()); return(this.Context.DbMehtods.GetSelfAndAutoFill(model.Args[0].MemberValue.ObjToString(), this.Context.IsSingle)); default: break; } return(null); }
private void ThrowUpdateByObject() { Check.Exception(UpdateParameterIsNull == false, ErrorMessage.GetThrowMessage("no support UpdateColumns and WhereColumns ", "根据表达式进行更新 禁止使用 UpdateColumns和WhereColumns ,你可以使用SetColumns 和 Where。 更新分为2种方式 1.根据表达式更新 2.根据实体或者集合更新 , 具体用法请查看文档 ")); }
/// <summary> /// 创建多语言视图,带有LanguageId=1的所有有视图1替换成languageValue 并且新创视图 名称为 原有视图名+_$_+suffix /// </summary> /// <returns></returns> public static void UpdateView(PubModel.Language lan, SqlSugarClient db) { if (lan == null) { return; } if (lan.Suffix.IsNullOrEmpty()) { Check.Exception(true, "LanguageHelper.lan.Suffix is Null Or Empty"); } if (PreSuffix.IsNullOrEmpty()) { Check.Exception(true, "LanguageHelper.PreSuffix is Null Or Empty"); } if (!lan.Suffix.StartsWith(PreSuffix)) { lan.Suffix = PreSuffix + lan.Suffix; } string sql = @" --验证参数传递规则 if LEFT(ltrim(@Suffix),3)<>'" + PreSuffix + @"' begin raiserror('参数传递格式不规范',16,1) return; end else if(ISNULL(" + lan.LanguageValue + @",'')='') begin raiserror('参数传递格式不规范',16,1) return; end declare @name varchar(100), --视图名称 @definition varchar(max) --视图脚本 --删除数据库里面所有带传递参数几号的视图 declare my_cursor cursor for select a.name,b.[definition] from sys.objects a JOIN sys.sql_modules b on a.[object_id]=b.[object_id] where [type]='v' and b.[definition] like '%" + lan.ReplaceViewStringKey + @"%' and a.name not like '%" + PreSuffix + @"%' --打开处理器 open my_cursor fetch next from my_cursor into @name,@definition while @@FETCH_STATUS=0 begin --脚本查询语言ID更改,并且更改新脚本语言的对象名称 set @definition=REPLACE( REPLACE( @definition, '" + lan.ReplaceViewStringKey + @"', '" + string.Format(lan.ReplaceViewStringValue, lan.LanguageValue) + @"' ), @name, @name+@Suffix ) --判断新脚本语言的对象名称是否存在,存在删除 exec( ' if object_id('''+@name+@Suffix+''',''v'') is not null begin drop view '+@name+@Suffix+' end ' ) exec(@definition) fetch next from my_cursor into @name,@definition end close my_cursor deallocate my_cursor "; db.ExecuteCommand(sql, new { Suffix = lan.Suffix }); }
public IDeleteable<T> Where(List<T> deleteObjs) { if (deleteObjs == null || deleteObjs.Count() == 0) { Where(SqlBuilder.SqlFalse); return this; } string tableName = this.Context.EntityMaintenance.GetTableName<T>(); var primaryFields = this.GetPrimaryKeys(); var isSinglePrimaryKey = primaryFields.Count == 1; Check.Exception(primaryFields.IsNullOrEmpty(), string.Format("Table {0} with no primarykey", tableName)); if (isSinglePrimaryKey) { List<object> primaryKeyValues = new List<object>(); var primaryField = primaryFields.Single(); foreach (var deleteObj in deleteObjs) { var entityPropertyName = this.Context.EntityMaintenance.GetPropertyName<T>(primaryField); var columnInfo = EntityInfo.Columns.Single(it => it.PropertyName.Equals(entityPropertyName, StringComparison.CurrentCultureIgnoreCase)); var value = columnInfo.PropertyInfo.GetValue(deleteObj, null); primaryKeyValues.Add(value); } if (primaryKeyValues.Count < 10000) { var inValueString = primaryKeyValues.ToArray().ToJoinSqlInVals(); Where(string.Format(DeleteBuilder.WhereInTemplate, SqlBuilder.GetTranslationColumnName(primaryFields.Single()), inValueString)); } else { if (DeleteBuilder.BigDataInValues == null) DeleteBuilder.BigDataInValues = new List<object>(); DeleteBuilder.BigDataInValues.AddRange(primaryKeyValues); DeleteBuilder.BigDataFiled = primaryField; } } else { StringBuilder whereInSql = new StringBuilder(); foreach (var deleteObj in deleteObjs) { StringBuilder orString = new StringBuilder(); var isFirst = deleteObjs.IndexOf(deleteObj) == 0; if (!isFirst) { orString.Append(DeleteBuilder.WhereInOrTemplate + UtilConstants.Space); } int i = 0; StringBuilder andString = new StringBuilder(); foreach (var primaryField in primaryFields) { if (i != 0) andString.Append(DeleteBuilder.WhereInAndTemplate + UtilConstants.Space); var entityPropertyName = this.Context.EntityMaintenance.GetPropertyName<T>(primaryField); var columnInfo = EntityInfo.Columns.Single(it => it.PropertyName == entityPropertyName); var entityValue = columnInfo.PropertyInfo.GetValue(deleteObj, null); var tempequals = DeleteBuilder.WhereInEqualTemplate; if (this.Context.CurrentConnectionConfig.MoreSettings != null && this.Context.CurrentConnectionConfig.MoreSettings.DisableNvarchar == true) { tempequals = "\"{0}\"='{1}' "; } if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle) { if (entityValue != null && UtilMethods.GetUnderType(entityValue.GetType()) == UtilConstants.DateType) { andString.AppendFormat("\"{0}\"={1} ", primaryField.ToUpper(), "to_date('" + entityValue.ObjToDate().ToString("yyyy-MM-dd HH:mm:ss") + "', 'YYYY-MM-DD HH24:MI:SS') "); } else { andString.AppendFormat(tempequals, primaryField.ToUpper(), entityValue); } } else if (this.Context.CurrentConnectionConfig.DbType == DbType.PostgreSQL && (this.Context.CurrentConnectionConfig.MoreSettings == null || this.Context.CurrentConnectionConfig.MoreSettings?.PgSqlIsAutoToLower == true)) { andString.AppendFormat("\"{0}\"={1} ", primaryField.ToLower(), new PostgreSQLExpressionContext().GetValue(entityValue)); } else if (this.Context.CurrentConnectionConfig.DbType == DbType.SqlServer && entityValue != null && UtilMethods.GetUnderType(entityValue.GetType()) == UtilConstants.DateType) { andString.AppendFormat("\"{0}\"={1} ", primaryField,$"'{entityValue.ObjToDate().ToString("yyyy-MM-dd HH:mm:ss.fff")}'"); } else { andString.AppendFormat(tempequals, primaryField, entityValue); } ++i; } orString.AppendFormat(DeleteBuilder.WhereInAreaTemplate, andString); whereInSql.Append(orString); } Where(string.Format(DeleteBuilder.WhereInAreaTemplate, whereInSql.ToString())); } return this; }
private void ThrowUpdateByObject() { Check.Exception(UpdateParameterIsNull == false, ErrorMessage.GetThrowMessage(" no support SetColumns and Where", "根据对像更新 db.Updateabe(对象) 禁止使用 SetColumns和Where ,你可以使用WhereColumns 和 UpdateColumns。 更新分为2种方式 1.根据表达式更新 2.根据实体或者集合更新 , 具体用法请查看文档 ")); }
/// <summary> /// if mysql return MySqlParameter[] pars /// if sqlerver return SqlParameter[] pars ... /// </summary> /// <param name="parameters"></param> /// <returns></returns> public override IDataParameter[] ToIDbDataParameter(params SugarParameter[] parameters) { if (parameters == null || parameters.Length == 0) { return(null); } NpgsqlParameter[] result = new NpgsqlParameter[parameters.Length]; int index = 0; var isVarchar = this.Context.IsVarchar(); foreach (var parameter in parameters) { if (parameter.Value == null) { parameter.Value = DBNull.Value; } if (parameter.Value is System.Data.SqlTypes.SqlDateTime && parameter.DbType == System.Data.DbType.AnsiString) { parameter.DbType = System.Data.DbType.DateTime; parameter.Value = DBNull.Value; } var sqlParameter = new NpgsqlParameter(); sqlParameter.ParameterName = parameter.ParameterName; sqlParameter.Size = parameter.Size; sqlParameter.Value = parameter.Value; sqlParameter.DbType = parameter.DbType; sqlParameter.Direction = parameter.Direction; if (parameter.IsJson) { sqlParameter.NpgsqlDbType = NpgsqlDbType.Json; } if (parameter.IsArray) { // sqlParameter.Value = this.Context.Utilities.SerializeObject(sqlParameter.Value); var type = sqlParameter.Value.GetType(); if (ArrayMapping.ContainsKey(type)) { sqlParameter.NpgsqlDbType = ArrayMapping[type] | NpgsqlDbType.Array; } else { Check.Exception(true, sqlParameter.Value.GetType().Name + " No Support"); } } if (sqlParameter.Direction == 0) { sqlParameter.Direction = ParameterDirection.Input; } result[index] = sqlParameter; if (sqlParameter.Direction.IsIn(ParameterDirection.Output, ParameterDirection.InputOutput, ParameterDirection.ReturnValue)) { if (this.OutputParameters == null) { this.OutputParameters = new List <IDataParameter>(); } this.OutputParameters.RemoveAll(it => it.ParameterName == sqlParameter.ParameterName); this.OutputParameters.Add(sqlParameter); } if (isVarchar && sqlParameter.DbType == System.Data.DbType.String) { sqlParameter.DbType = System.Data.DbType.AnsiString; } ++index; } return(result); }
private void PreToSql() { UpdateBuilder.PrimaryKeys = GetPrimaryKeys(); if (this.IsWhereColumns) { foreach (var pkName in UpdateBuilder.PrimaryKeys) { var isContains = this.UpdateBuilder.DbColumnInfoList.Select(it => it.DbColumnName.ToLower()).Contains(pkName.ToLower()); Check.Exception(isContains == false, "Use UpdateColumns().WhereColumn() ,UpdateColumns need {0}", pkName); } } #region IgnoreColumns if (this.Context.IgnoreColumns != null && this.Context.IgnoreColumns.Any()) { var currentIgnoreColumns = this.Context.IgnoreColumns.Where(it => it.EntityName == this.EntityInfo.EntityName).ToList(); this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => { return(!currentIgnoreColumns.Any(i => it.PropertyName.Equals(i.PropertyName, StringComparison.CurrentCulture))); }).ToList(); } #endregion if (this.IsSingle) { foreach (var item in this.UpdateBuilder.DbColumnInfoList) { if (this.UpdateBuilder.Parameters == null) { this.UpdateBuilder.Parameters = new List <SugarParameter>(); } if (this.UpdateBuilder.SetValues.Any(it => this.SqlBuilder.GetNoTranslationColumnName(it.Key) == item.PropertyName)) { continue; } this.UpdateBuilder.Parameters.Add(new SugarParameter(this.SqlBuilder.SqlParameterKeyWord + item.DbColumnName, item.Value, item.PropertyType)); } } #region Identities List <string> identities = GetIdentityKeys(); if (identities != null && identities.Any()) { this.UpdateBuilder.DbColumnInfoList.ForEach(it => { var mappingInfo = identities.SingleOrDefault(i => it.DbColumnName.Equals(i, StringComparison.CurrentCultureIgnoreCase)); if (mappingInfo != null && mappingInfo.Any()) { it.IsIdentity = true; } }); } #endregion List <string> primaryKey = GetPrimaryKeys(); if (primaryKey != null && primaryKey.Count > 0) { this.UpdateBuilder.DbColumnInfoList.ForEach(it => { var mappingInfo = primaryKey.SingleOrDefault(i => it.DbColumnName.Equals(i, StringComparison.CurrentCultureIgnoreCase)); if (mappingInfo != null && mappingInfo.Any()) { it.IsPrimarykey = true; } }); } if (this.UpdateBuilder.Parameters.HasValue() && this.UpdateBuilder.SetValues.IsValuable()) { this.UpdateBuilder.Parameters.RemoveAll(it => this.UpdateBuilder.SetValues.Any(v => (SqlBuilder.SqlParameterKeyWord + SqlBuilder.GetNoTranslationColumnName(v.Key)) == it.ParameterName)); } }
public override void ExistLogic(EntityInfo entityInfo) { if (entityInfo.Columns.HasValue()) { Check.Exception(entityInfo.Columns.Where(it => it.IsPrimarykey).Count() > 1, "Use Code First ,The primary key must not exceed 1"); var tableName = GetTableName(entityInfo); var dbColumns = this.Context.DbMaintenance.GetColumnInfosByTableName(tableName); ConvertColumns(dbColumns); var entityColumns = entityInfo.Columns.Where(it => it.IsIgnore == false).ToList(); var dropColumns = dbColumns .Where(dc => !entityColumns.Any(ec => dc.DbColumnName.Equals(ec.OldDbColumnName, StringComparison.CurrentCultureIgnoreCase))) .Where(dc => !entityColumns.Any(ec => dc.DbColumnName.Equals(ec.DbColumnName, StringComparison.CurrentCultureIgnoreCase))) .ToList(); var addColumns = entityColumns .Where(ec => ec.OldDbColumnName.IsNullOrEmpty() || !dbColumns.Any(dc => dc.DbColumnName.Equals(ec.OldDbColumnName, StringComparison.CurrentCultureIgnoreCase))) .Where(ec => !dbColumns.Any(dc => ec.DbColumnName.Equals(dc.DbColumnName, StringComparison.CurrentCultureIgnoreCase))).ToList(); //var alterColumns = entityColumns // .Where(ec => !dbColumns.Any(dc => dc.DbColumnName.Equals(ec.OldDbColumnName, StringComparison.CurrentCultureIgnoreCase))) // .Where(ec => // dbColumns.Any(dc => dc.DbColumnName.Equals(ec.DbColumnName) // && ((!UtilMethods.GetUnderType(ec.PropertyInfo).IsEnum() && UtilMethods.GetUnderType(ec.PropertyInfo).IsIn(UtilConstants.StringType)) || // IsSamgeType(ec, dc)))).ToList(); var renameColumns = entityColumns .Where(it => !string.IsNullOrEmpty(it.OldDbColumnName)) .Where(entityColumn => dbColumns.Any(dbColumn => entityColumn.OldDbColumnName.Equals(dbColumn.DbColumnName, StringComparison.CurrentCultureIgnoreCase))) .ToList(); var isChange = false; foreach (var item in addColumns) { this.Context.DbMaintenance.AddColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item)); isChange = true; } foreach (var item in dropColumns) { //this.Context.DbMaintenance.DropColumn(tableName, item.DbColumnName); //isChange = true; } //foreach (var item in alterColumns) //{ // //this.Context.DbMaintenance.AddColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item)); // //isChange = true; //} foreach (var item in renameColumns) { throw new NotSupportedException("rename Column"); } foreach (var item in entityColumns) { var dbColumn = dbColumns.FirstOrDefault(dc => dc.DbColumnName.Equals(item.DbColumnName, StringComparison.CurrentCultureIgnoreCase)); if (dbColumn == null) { continue; } bool pkDiff, idEntityDiff; KeyAction(item, dbColumn, out pkDiff, out idEntityDiff); if (dbColumn != null && pkDiff && !idEntityDiff) { var isAdd = item.IsPrimarykey; if (isAdd) { this.Context.DbMaintenance.AddPrimaryKey(tableName, item.DbColumnName); } else { this.Context.DbMaintenance.DropConstraint(tableName, string.Format("PK_{0}_{1}", tableName, item.DbColumnName)); } } else if (pkDiff || idEntityDiff) { ChangeKey(entityInfo, tableName, item); } } if (isChange && base.IsBackupTable) { this.Context.DbMaintenance.BackupTable(tableName, tableName + DateTime.Now.ToString("yyyyMMddHHmmss"), MaxBackupDataRows); } } }
private void AppendModelByIIFBinary(ExpressionParameter parameter, MethodCallExpressionModel model, Expression item) { Check.Exception(true, "The SqlFunc.IIF(arg1,arg2,arg3) , {0} argument do not support ", item.ToString()); }
void Error01() { Check.Exception(mappers == null, ErrorMessage.GetThrowMessage(expression.ToString() + "no support", "当前表达式" + expression.ToString() + "必须在Mapper之后使用")); }
protected override string TomultipleSqlString(List <IGrouping <int, DbColumnInfo> > groupList) { Check.Exception(PrimaryKeys == null || PrimaryKeys.Count == 0, " Update List<T> need Primary key"); int pageSize = 200; int pageIndex = 1; int totalRecord = groupList.Count; int pageCount = (totalRecord + pageSize - 1) / pageSize; StringBuilder batchUpdateSql = new StringBuilder(); while (pageCount >= pageIndex) { StringBuilder updateTable = new StringBuilder(); string setValues = string.Join(",", groupList.First().Where(it => it.IsPrimarykey == false && (it.IsIdentity == false || (IsOffIdentity && it.IsIdentity))).Select(it => { if (SetValues.IsValuable()) { var setValue = SetValues.Where(sv => sv.Key == Builder.GetTranslationColumnName(it.DbColumnName)); if (setValue != null && setValue.Any()) { return(setValue.First().Value); } } var result = string.Format("S.{0}=T.{0}", Builder.GetTranslationColumnName(it.DbColumnName)); return(result); })); batchUpdateSql.AppendFormat(SqlTemplateBatch.ToString(), setValues, GetTableNameStringNoWith, TableWithString); int i = 0; foreach (var columns in groupList.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList()) { var isFirst = i == 0; if (!isFirst) { updateTable.Append(SqlTemplateBatchUnion); } updateTable.Append("\r\n SELECT " + string.Join(",", columns.Select(it => string.Format(SqlTemplateBatchSelect, FormatValue(it.Value), this.Builder.GetTranslationColumnName(it.DbColumnName))))); ++i; } pageIndex++; updateTable.Append("\r\n"); string whereString = null; if (this.WhereValues.HasValue()) { foreach (var item in WhereValues) { var isFirst = whereString == null; whereString += (isFirst ? null : " AND "); whereString += Regex.Replace(item, " \\" + this.Builder.SqlTranslationLeft, "S." + this.Builder.SqlTranslationLeft); } } if (PrimaryKeys.HasValue()) { foreach (var item in PrimaryKeys) { var isFirst = whereString == null; whereString += (isFirst ? null : " AND "); whereString += string.Format("S.{0}=T.{0}", Builder.GetTranslationColumnName(item)); } } var format = string.Format(SqlTemplateJoin, updateTable, whereString); batchUpdateSql.Replace("${0}", format); batchUpdateSql.Append(";"); } return(batchUpdateSql.ToString()); }
void ThrowTrue(bool isError) { Check.Exception(isError, ErrorMessage.GetThrowMessage(expression.ToString() + "no support", "不支持表达式" + expression.ToString() + " 1.检查当前表达式中的别名是否与Mapper中的一致 2.目前只支持 1对1 Mapper下的 Where ")); }
/// <summary> /// 递归解析表达式路由计算 /// </summary> /// <returns></returns> private string CreateSqlElements(Expression exp, ref MemberType type, bool isTure = true) { if (exp is LambdaExpression) { LambdaExpression lambda = exp as LambdaExpression; var expression = lambda.Body; MemberType EleType = MemberType.None; return(CreateSqlElements(expression, ref EleType)); } else if (exp is BinaryExpression) { var expression = exp as BinaryExpression; MemberType leftType = MemberType.None; MemberType rightType = MemberType.None; var leftIsDateTime = expression.Left.Type.ToString().Contains("System.DateTime"); var rightIsDateTime = expression.Right.Type.ToString().Contains("System.DateTime"); var left = CreateSqlElements(expression.Left, ref leftType); var right = CreateSqlElements(expression.Right, ref rightType); var oper = GetOperator(expression.NodeType); var isKeyOperValue = leftType == MemberType.Key && rightType == MemberType.Value; var isValueOperKey = rightType == MemberType.Key && leftType == MemberType.Value; #region 处理 null if (isKeyOperValue & (right == "null" || right == null) && oper.Trim() == "=") { var oldLeft = AddParas(ref left, right); return(string.Format(" ({0} is null ) ", oldLeft)); } else if (isKeyOperValue & (right == "null" || right == null) && oper.Trim() == "<>") { var oldLeft = AddParas(ref left, right); return(string.Format(" ({0} is not null ) ", oldLeft)); } else if (isValueOperKey & (left == "null" || left == null) && oper.Trim() == "=") { return(string.Format(" ({0} is null ) ", right)); } else if (isValueOperKey & (left == "null" || left == null) && oper.Trim() == "<>") { return(string.Format(" ({0} is not null ) ", right)); } #endregion else if (isKeyOperValue) { object parValue = null; if (leftIsDateTime && right != null && right.IsDate()) { parValue = Convert.ToDateTime(right); } else { parValue = right; } var oldLeft = AddParas(ref left, parValue); return(string.Format(" ({0} {1} @{2}) ", oldLeft, oper, left)); } else if (isValueOperKey) { object parValue = null; if (rightIsDateTime && left != null && left.IsDate()) { parValue = Convert.ToDateTime(left); } else { parValue = left; } var oldRight = AddParasReturnRight(parValue, ref right); return(string.Format("( @{0} {1} {2} )", right, oper, oldRight)); } else if (leftType == MemberType.Value && rightType == MemberType.Value) { return(string.Format("( '{0}' {1} '{2}' )", left, oper, right)); } else { return(string.Format("( {0} {1} {2} )", left, oper, right)); } } else if (exp is BlockExpression) { } else if (exp is ConditionalExpression) { } else if (exp is MethodCallExpression) { MethodCallExpression mce = (MethodCallExpression)exp; string methodName = mce.Method.Name; if (methodName == "Contains") { return(Contains(methodName, mce, isTure)); } else if (methodName == "StartsWith") { return(StartsWith(methodName, mce, isTure)); } else if (methodName == "EndWith") { return(EndWith(methodName, mce, isTure)); } else if (methodName == "ToString") { type = MemberType.Value; return(MethodToString(methodName, mce, ref type)); } else if (methodName.StartsWith("To")) { type = MemberType.Value; return(MethodTo(methodName, mce, ref type)); } } else if (exp is ConstantExpression) { type = MemberType.Value; ConstantExpression ce = ((ConstantExpression)exp); if (ce.Value == null) { return("null"); } else { return(ce.Value.ToString()); } } else if (exp is MemberExpression) { MemberExpression me = ((MemberExpression)exp); if (me.Expression == null || me.Expression.NodeType.ToString() != "Parameter") { type = MemberType.Value; object dynInv = null; try { // var dynInv = Expression.Lambda(exp).Compile().DynamicInvoke();原始写法性能极慢,下面写法性能提高了几十倍 // var dynInv= Expression.Lambda(me.Expression as ConstantExpression).Compile().DynamicInvoke(); var conExp = me.Expression as ConstantExpression; if (conExp != null) { dynInv = (me.Member as System.Reflection.FieldInfo).GetValue((me.Expression as ConstantExpression).Value); } else { var memberInfos = new Stack <MemberInfo>(); // "descend" toward's the root object reference: while (exp is MemberExpression) { var memberExpr = exp as MemberExpression; memberInfos.Push(memberExpr.Member); exp = memberExpr.Expression; } // fetch the root object reference: var constExpr = exp as ConstantExpression; var objReference = constExpr.Value; // "ascend" back whence we came from and resolve object references along the way: while (memberInfos.Count > 0) // or some other break condition { var mi = memberInfos.Pop(); if (mi.MemberType == MemberTypes.Property) { objReference = objReference.GetType() .GetProperty(mi.Name) .GetValue(objReference, null); } else if (mi.MemberType == MemberTypes.Field) { objReference = objReference.GetType() .GetField(mi.Name) .GetValue(objReference); } } dynInv = objReference; } } catch (Exception ex) { if (me.ToString() == "DateTime.Now") { return(DateTime.Now.ToString()); } Check.Exception(true, "错误信息:{0} \r\n message:{1}", "拉姆达解析出错", ex.Message); } if (dynInv == null) { return(null); } else { return(dynInv.ToString()); } } else { if (Type == ResolveExpressType.nT) { type = MemberType.Key; return(exp.ToString()); } string name = me.Member.Name; type = MemberType.Key; return(name); } } else if (exp is UnaryExpression) { UnaryExpression ue = ((UnaryExpression)exp); var mex = ue.Operand; return(CreateSqlElements(mex, ref type, false)); } return(null); }
public IInsertable <T> Insertable <T>(T insertObj) where T : class, new() { Check.Exception(typeof(T).FullName.Contains("System.Collections.Generic.List`"), " need where T: class, new() "); return(this.Context.Insertable <T>(insertObj)); }
public virtual ISugarQueryable <T> UnionAll <T>(List <ISugarQueryable <T> > queryables) where T : class, new() { Check.Exception(queryables.IsNullOrEmpty(), "UnionAll.queryables is null "); return(UnionAll(queryables.ToArray())); }
public StorageableResult <T> ToStorage() { if (whereFuncs == null || whereFuncs.Count == 0) { return(this.Saveable().ToStorage()); } if (this.allDatas.Count == 0) { return new StorageableResult <T>() { AsDeleteable = this.Context.Deleteable <T>().AS(asname).Where(it => false), AsInsertable = this.Context.Insertable(new List <T>()).AS(asname), AsUpdateable = this.Context.Updateable(new List <T>()).AS(asname), InsertList = new List <StorageableMessage <T> >(), UpdateList = new List <StorageableMessage <T> >(), DeleteList = new List <StorageableMessage <T> >(), ErrorList = new List <StorageableMessage <T> >(), IgnoreList = new List <StorageableMessage <T> >(), OtherList = new List <StorageableMessage <T> >(), TotalList = new List <StorageableMessage <T> >() } } ; var pkInfos = this.Context.EntityMaintenance.GetEntityInfo <T>().Columns.Where(it => it.IsPrimarykey); if (whereExpression == null && !pkInfos.Any()) { Check.Exception(true, "Need primary key or WhereColumn"); } if (whereExpression == null && pkInfos.Any()) { this.Context.Utilities.PageEach(allDatas, 300, item => { var addItems = this.Context.Queryable <T>().AS(asname).WhereClassByPrimaryKey(item.Select(it => it.Item).ToList()).ToList(); dbDataList.AddRange(addItems); }); } var pkProperties = GetPkProperties(pkInfos); var messageList = allDatas.Select(it => new StorageableMessage <T>() { Item = it.Item, Database = dbDataList, PkFields = pkProperties }).ToList(); foreach (var item in whereFuncs.OrderByDescending(it => (int)it.key)) { List <StorageableMessage <T> > whereList = messageList.Where(it => it.StorageType == null).ToList(); Func <StorageableMessage <T>, bool> exp = item.value1; var list = whereList.Where(exp).ToList(); foreach (var it in list) { it.StorageType = item.key; it.StorageMessage = item.value2; } } var delete = messageList.Where(it => it.StorageType == StorageType.Delete).ToList(); var update = messageList.Where(it => it.StorageType == StorageType.Update).ToList(); var inset = messageList.Where(it => it.StorageType == StorageType.Insert).ToList(); var error = messageList.Where(it => it.StorageType == StorageType.Error).ToList(); var ignore = messageList.Where(it => it.StorageType == StorageType.Ignore || it.StorageType == null).ToList(); var other = messageList.Where(it => it.StorageType == StorageType.Other).ToList(); StorageableResult <T> result = new StorageableResult <T>() { _WhereColumnList = wherecolumnList, _AsName = asname, _Context = this.Context, AsDeleteable = this.Context.Deleteable <T>().AS(asname), AsUpdateable = this.Context.Updateable(update.Select(it => it.Item).ToList()).AS(asname), AsInsertable = this.Context.Insertable(inset.Select(it => it.Item).ToList()).AS(asname), OtherList = other, InsertList = inset, DeleteList = delete, UpdateList = update, ErrorList = error, IgnoreList = ignore, TotalList = messageList }; if (this.whereExpression != null) { result.AsUpdateable.WhereColumns(whereExpression); result.AsDeleteable.WhereColumns(whereExpression); } result.AsDeleteable.Where(delete.Select(it => it.Item).ToList()); return(result); }
public virtual void ExistLogic(EntityInfo entityInfo) { if (entityInfo.Columns.HasValue()) { //Check.Exception(entityInfo.Columns.Where(it => it.IsPrimarykey).Count() > 1, "Multiple primary keys do not support modifications"); var tableName = GetTableName(entityInfo); var dbColumns = this.Context.DbMaintenance.GetColumnInfosByTableName(tableName); ConvertColumns(dbColumns); var entityColumns = entityInfo.Columns.Where(it => it.IsIgnore == false).ToList(); //var dropColumns = dbColumns // .Where(dc => !entityColumns.Any(ec => dc.DbColumnName.Equals(ec.OldDbColumnName, StringComparison.CurrentCultureIgnoreCase))) // .Where(dc => !entityColumns.Any(ec => dc.DbColumnName.Equals(ec.DbColumnName, StringComparison.CurrentCultureIgnoreCase))) // .ToList(); var addColumns = entityColumns .Where(ec => ec.OldDbColumnName.IsNullOrEmpty() || !dbColumns.Any(dc => dc.DbColumnName.Equals(ec.OldDbColumnName, StringComparison.CurrentCultureIgnoreCase))) .Where(ec => !dbColumns.Any(dc => ec.DbColumnName.Equals(dc.DbColumnName, StringComparison.CurrentCultureIgnoreCase))).ToList(); var alterColumns = entityColumns .Where(ec => !dbColumns.Any(dc => dc.DbColumnName.Equals(ec.OldDbColumnName, StringComparison.CurrentCultureIgnoreCase))) .Where(ec => dbColumns.Any(dc => dc.DbColumnName.Equals(ec.DbColumnName) && ((ec.Length != dc.Length && !UtilMethods.GetUnderType(ec.PropertyInfo).IsEnum() && UtilMethods.GetUnderType(ec.PropertyInfo).IsIn(UtilConstants.StringType)) || ec.IsNullable != dc.IsNullable || IsSamgeType(ec, dc)))).ToList(); var renameColumns = entityColumns .Where(it => !string.IsNullOrEmpty(it.OldDbColumnName)) .Where(entityColumn => dbColumns.Any(dbColumn => entityColumn.OldDbColumnName.Equals(dbColumn.DbColumnName, StringComparison.CurrentCultureIgnoreCase))) .ToList(); var isMultiplePrimaryKey = dbColumns.Where(it => it.IsPrimarykey).Count() > 1 || entityColumns.Where(it => it.IsPrimarykey).Count() > 1; var isChange = false; foreach (var item in addColumns) { this.Context.DbMaintenance.AddColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item)); isChange = true; } //foreach (var item in dropColumns) //{ // this.Context.DbMaintenance.DropColumn(tableName, item.DbColumnName); // isChange = true; //} foreach (var item in alterColumns) { this.Context.DbMaintenance.UpdateColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item)); isChange = true; } foreach (var item in renameColumns) { this.Context.DbMaintenance.RenameColumn(tableName, item.OldDbColumnName, item.DbColumnName); isChange = true; } foreach (var item in entityColumns) { var dbColumn = dbColumns.FirstOrDefault(dc => dc.DbColumnName.Equals(item.DbColumnName, StringComparison.CurrentCultureIgnoreCase)); if (dbColumn == null) { continue; } bool pkDiff, idEntityDiff; KeyAction(item, dbColumn, out pkDiff, out idEntityDiff); if (dbColumn != null && pkDiff && !idEntityDiff && isMultiplePrimaryKey == false) { var isAdd = item.IsPrimarykey; if (isAdd) { this.Context.DbMaintenance.AddPrimaryKey(tableName, item.DbColumnName); } else { this.Context.DbMaintenance.DropConstraint(tableName, string.Format("PK_{0}_{1}", tableName, item.DbColumnName)); } } else if ((pkDiff || idEntityDiff) && isMultiplePrimaryKey == false) { ChangeKey(entityInfo, tableName, item); } } if (isMultiplePrimaryKey) { var oldPkNames = dbColumns.Where(it => it.IsPrimarykey).Select(it => it.DbColumnName.ToLower()).OrderBy(it => it).ToList(); var newPkNames = entityColumns.Where(it => it.IsPrimarykey).Select(it => it.DbColumnName.ToLower()).OrderBy(it => it).ToList(); if (!Enumerable.SequenceEqual(oldPkNames, newPkNames)) { Check.Exception(true, ErrorMessage.GetThrowMessage("Modification of multiple primary key tables is not supported. Delete tables while creating", "不支持修改多主键表,请删除表在创建")); } } if (isChange && IsBackupTable) { this.Context.DbMaintenance.BackupTable(tableName, tableName + DateTime.Now.ToString("yyyyMMddHHmmss"), MaxBackupDataRows); } } }
private void ThrowUpdateByExpression() { Check.Exception(UpdateParameterIsNull == true, ErrorMessage.GetThrowMessage(" no support UpdateColumns and WhereColumns", "根据表达式更新 db.Updateable<T>() 禁止使用 UpdateColumns和WhereColumns,你可以使用 SetColumns Where 等。更新分为2种方式 1.根据表达式更新 2.根据实体或者集合更新, 具体用法请查看文档 ")); }
protected override string TomultipleSqlString(List <IGrouping <int, DbColumnInfo> > groupList) { Check.Exception(PrimaryKeys == null || PrimaryKeys.Count == 0, " Update List<T> need Primary key"); int pageSize = 200; int pageIndex = 1; int totalRecord = groupList.Count; int pageCount = (totalRecord + pageSize - 1) / pageSize; StringBuilder batchUpdateSql = new StringBuilder(); while (pageCount >= pageIndex) { StringBuilder updateTable = new StringBuilder(); string setValues = string.Join(",", groupList.First().Where(it => it.IsPrimarykey == false && (it.IsIdentity == false || (IsOffIdentity && it.IsIdentity))).Select(it => { if (SetValues.IsValuable()) { var setValue = SetValues.Where(sv => sv.Key == Builder.GetTranslationColumnName(it.DbColumnName)); if (setValue != null && setValue.Any()) { return(setValue.First().Value); } } var result = string.Format("{0}=T.{0}", Builder.GetTranslationColumnName(it.DbColumnName)); return(result); })); string tempColumnValue = string.Join(",", groupList.First().Select(it => { if (SetValues.IsValuable()) { var setValue = SetValues.Where(sv => sv.Key == Builder.GetTranslationColumnName(it.DbColumnName)); if (setValue != null && setValue.Any()) { return(setValue.First().Value); } } var result = Builder.GetTranslationColumnName(it.DbColumnName); return(result); })); batchUpdateSql.AppendFormat(SqlTemplateBatch.ToString(), setValues, GetTableNameStringNoWith, TableWithString); int i = 0; var tableColumnList = this.Context.DbMaintenance.GetColumnInfosByTableName(GetTableNameStringNoWith); foreach (var columns in groupList.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList()) { var isFirst = i == 0; if (!isFirst) { updateTable.Append(SqlTemplateBatchUnion); } updateTable.Append("\r\n (" + string.Join(",", columns.Select(it => string.Format("CAST({0} AS {1})", FormatValue(it.Value), tableColumnList.FirstOrDefault(x => x.DbColumnName.Equals(it.DbColumnName, StringComparison.OrdinalIgnoreCase))?.DataType))) + ")"); ++i; } pageIndex++; updateTable.Append("\r\n"); string whereString = null; if (this.WhereValues.HasValue()) { foreach (var item in WhereValues) { var isFirst = whereString == null; whereString += (isFirst ? null : " AND "); whereString += item; } } else if (PrimaryKeys.HasValue()) { foreach (var item in PrimaryKeys) { var isFirst = whereString == null; whereString += (isFirst ? null : " AND "); whereString += string.Format("{0}.{1}=T.{1}", GetTableNameStringNoWith, Builder.GetTranslationColumnName(item)); } } var format = string.Format(SqlTemplateJoin, updateTable, whereString, tempColumnValue); batchUpdateSql.Replace("${0}", format); batchUpdateSql.Append(";"); } return(batchUpdateSql.ToString()); }
private bool SqlBulkReplace <T>(IEnumerable <T> entities) where T : class { if (entities == null) { return(false); } ; StringBuilder sbSql = new StringBuilder(""); Type type = typeof(T); string typeName = type.Name; typeName = GetTableNameByClassType(typeName); string pkName = SqlSugarTool.GetPrimaryKeyByTableName(this, typeName); Check.Exception(pkName.IsNullOrEmpty(), "没有找到主键。"); var identityNames = SqlSugarTool.GetIdentitiesKeyByTableName(this, typeName); var isIdentity = identityNames != null && identityNames.Count > 0; var columnNames = SqlSugarTool.GetColumnsByTableName(this, typeName); if (isIdentity) { columnNames = columnNames.Where(c => !identityNames.Any(it => it.Value == c)).ToList();//去掉自添列 } //属性缓存 string cachePropertiesKey = "db." + type.FullName + ".GetProperties"; var cachePropertiesManager = CacheManager <PropertyInfo[]> .GetInstance(); PropertyInfo[] props = null; if (cachePropertiesManager.ContainsKey(cachePropertiesKey)) { props = cachePropertiesManager[cachePropertiesKey]; } else { props = type.GetProperties(); cachePropertiesManager.Add(cachePropertiesKey, props, cachePropertiesManager.Day); } foreach (var entity in entities) { string pkValue = string.Empty; sbSql.Append(" UPDATE "); sbSql.Append(typeName); sbSql.Append(" SET "); pkValue = props.Single(it => it.Name.ToLower() == pkName.ToLower()).GetValue(entity, null).ToString(); foreach (var name in columnNames) { var isPk = pkName != null && pkName.ToLower() == name.ToLower(); var isDisableUpdateColumns = DisableUpdateColumns != null && DisableUpdateColumns.Any(it => it.ToLower() == name.ToLower()); var isLastName = name == columnNames.Last(); var prop = props.Single(it => it.Name == name); var objValue = prop.GetValue(entity, null); if (this.IsIgnoreErrorColumns) { if (!SqlSugarTool.GetColumnsByTableName(this, typeName).Any(it => it.ToLower() == name.ToLower())) { continue; } } if (isPk || isDisableUpdateColumns) { continue; } bool isNullable = false; var underType = SqlSugarTool.GetUnderType(prop, ref isNullable); if (objValue == null) { objValue = "NULL"; } else if (underType == SqlSugarTool.DateType) { objValue = "'" + objValue.ToString() + "'"; } else if (underType == SqlSugarTool.BoolType) { objValue = Convert.ToBoolean(objValue) ? 1 : 0; } else if (underType == SqlSugarTool.StringType) { //string参数需要处理注入 (因为SqlParameter参数上限为2100所以无法使用参数化) objValue = "'" + objValue.ToString().ToSqlFilter() + "'"; } else { objValue = "'" + objValue.ToString() + "'"; } sbSql.AppendFormat(" [{0}]={1}{2} ", name, objValue, ","); } sbSql.Remove(sbSql.ToString().LastIndexOf(","), 1); sbSql.AppendFormat("WHERE [{0}]='{1}' ", pkName, pkValue.ToSuperSqlFilter()); } var reval = base.ExecuteCommand(sbSql.ToString()); sbSql = null; return(reval > 0); }