Exception() public static method

使用指定的错误消息初始化 System.Exception 类的新实例。
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;
 }
Beispiel #2
0
        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;
            }
        }
Beispiel #3
0
        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);
        }
Beispiel #5
0
        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));
 }
Beispiel #9
0
        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);
        }
Beispiel #10
0
        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.根据实体或者集合更新 , 具体用法请查看文档 "));
 }
Beispiel #13
0
        /// <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;
 }
Beispiel #15
0
 private void ThrowUpdateByObject()
 {
     Check.Exception(UpdateParameterIsNull == false, ErrorMessage.GetThrowMessage(" no support SetColumns and Where", "根据对像更新 db.Updateabe(对象) 禁止使用 SetColumns和Where ,你可以使用WhereColumns 和  UpdateColumns。 更新分为2种方式 1.根据表达式更新 2.根据实体或者集合更新 , 具体用法请查看文档 "));
 }
Beispiel #16
0
        /// <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);
        }
Beispiel #17
0
        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));
            }
        }
Beispiel #18
0
        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之后使用"));
 }
Beispiel #21
0
        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 "));
 }
Beispiel #23
0
        /// <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);
        }
Beispiel #24
0
 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));
 }
Beispiel #25
0
 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()));
 }
Beispiel #26
0
        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);
        }
Beispiel #27
0
        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);
                }
            }
        }
Beispiel #28
0
 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);
        }