mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	- 修复 Delete.Where in 查询为空的时候仍然执行删除;#1068
This commit is contained in:
		@@ -538,5 +538,14 @@
 | 
				
			|||||||
            <param name="that"></param>
 | 
					            <param name="that"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            批量注入 Repository,可以参考代码自行调整
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="services"></param>
 | 
				
			||||||
 | 
					            <param name="globalDataFilter"></param>
 | 
				
			||||||
 | 
					            <param name="assemblies"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
    </members>
 | 
					    </members>
 | 
				
			||||||
</doc>
 | 
					</doc>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -256,13 +256,14 @@ namespace FreeSql.DataAnnotations
 | 
				
			|||||||
        public string[] GetTableNamesBySqlWhere(string sqlWhere, List<DbParameter> dbParams, SelectTableInfo tb, CommonUtils commonUtils)
 | 
					        public string[] GetTableNamesBySqlWhere(string sqlWhere, List<DbParameter> dbParams, SelectTableInfo tb, CommonUtils commonUtils)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (string.IsNullOrWhiteSpace(sqlWhere)) return AllTables;
 | 
					            if (string.IsNullOrWhiteSpace(sqlWhere)) return AllTables;
 | 
				
			||||||
            var dictParams = new Dictionary<string, string>();
 | 
					 | 
				
			||||||
            var newSqlWhere = Utils.ReplaceSqlConstString(sqlWhere, dictParams);
 | 
					 | 
				
			||||||
            var tsqlWhere = Utils.ParseSqlWhereLevel1(sqlWhere);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            var quoteParameterName = commonUtils.QuoteParamterName("");
 | 
					            var quoteParameterName = commonUtils.QuoteParamterName("");
 | 
				
			||||||
            var quoteParameterNameCharArray = quoteParameterName.ToCharArray();
 | 
					            var quoteParameterNameCharArray = quoteParameterName.ToCharArray();
 | 
				
			||||||
            var columnName = commonUtils.QuoteSqlName(tb.Table.AsTableColumn.Attribute.Name);
 | 
					            var columnName = commonUtils.QuoteSqlName(tb.Table.AsTableColumn.Attribute.Name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var dictParams = new Dictionary<string, string>();
 | 
				
			||||||
 | 
					            var newSqlWhere = Utils.ReplaceSqlConstString(sqlWhere, dictParams, quoteParameterName);
 | 
				
			||||||
 | 
					            //var tsqlWhere = Utils.ParseSqlWhereLevel1(sqlWhere);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var regs = GetRegSqlWhereDateTimes($"{(string.IsNullOrWhiteSpace(tb.Alias) ? "" : $"{tb.Alias}.")}{commonUtils.QuoteSqlName(tb.Table.AsTableColumn.Attribute.Name)}", quoteParameterName);
 | 
					            var regs = GetRegSqlWhereDateTimes($"{(string.IsNullOrWhiteSpace(tb.Alias) ? "" : $"{tb.Alias}.")}{commonUtils.QuoteSqlName(tb.Table.AsTableColumn.Attribute.Name)}", quoteParameterName);
 | 
				
			||||||
            for (var a = 0; a < 8; a++) newSqlWhere = regs[a].Replace(newSqlWhere, "$1$4");
 | 
					            for (var a = 0; a < 8; a++) newSqlWhere = regs[a].Replace(newSqlWhere, "$1$4");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -170,7 +170,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        public virtual string ToSql()
 | 
					        public virtual string ToSql()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (_whereTimes <= 0) return null;
 | 
					            if (_whereTimes <= 0 || _where.Length == 0) return null;
 | 
				
			||||||
            var sb = new StringBuilder();
 | 
					            var sb = new StringBuilder();
 | 
				
			||||||
            ToSqlFetch(sql =>
 | 
					            ToSqlFetch(sql =>
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -182,7 +182,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        public void ToSqlFetch(Action<StringBuilder> fetch)
 | 
					        public void ToSqlFetch(Action<StringBuilder> fetch)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (_whereTimes <= 0) return;
 | 
					            if (_whereTimes <= 0 || _where.Length == 0) return;
 | 
				
			||||||
            var newwhere = new StringBuilder().Append(" WHERE ").Append(_where);
 | 
					            var newwhere = new StringBuilder().Append(" WHERE ").Append(_where);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (_whereGlobalFilter.Any())
 | 
					            if (_whereGlobalFilter.Any())
 | 
				
			||||||
@@ -215,7 +215,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
#else
 | 
					#else
 | 
				
			||||||
        async public Task ToSqlFetchAsync(Func<StringBuilder, Task> fetchAsync)
 | 
					        async public Task ToSqlFetchAsync(Func<StringBuilder, Task> fetchAsync)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (_whereTimes <= 0) return;
 | 
					            if (_whereTimes <= 0 || _where.Length == 0) return;
 | 
				
			||||||
            var newwhere = new StringBuilder().Append(" WHERE ").Append(_where);
 | 
					            var newwhere = new StringBuilder().Append(" WHERE ").Append(_where);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (_whereGlobalFilter.Any())
 | 
					            if (_whereGlobalFilter.Any())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2268,11 +2268,19 @@ namespace FreeSql.Internal
 | 
				
			|||||||
            return char.IsLetter(name, 0) ? name : string.Concat("_", name);
 | 
					            return char.IsLetter(name, 0) ? name : string.Concat("_", name);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public static string ReplaceSqlConstString(string sql, Dictionary<string, string> parms)
 | 
					        public static string ReplaceSqlConstString(string sql, Dictionary<string, string> parms, string paramPrefix = "@")
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var nsb = new StringBuilder();
 | 
					            var nsb = new StringBuilder();
 | 
				
			||||||
            var sidx = 0;
 | 
					            var sidx = 0;
 | 
				
			||||||
            var pidx = 0;
 | 
					            var pidx = 0;
 | 
				
			||||||
 | 
					            var ptmpPrefix = "";
 | 
				
			||||||
 | 
					            while (true)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                pidx++;
 | 
				
			||||||
 | 
					                ptmpPrefix = $"{paramPrefix}p{pidx}";
 | 
				
			||||||
 | 
					                if (sql.Contains(ptmpPrefix) == false) break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            pidx = 0;
 | 
				
			||||||
            while (sidx < sql.Length)
 | 
					            while (sidx < sql.Length)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                var chr = sql[sidx++];
 | 
					                var chr = sql[sidx++];
 | 
				
			||||||
@@ -2307,7 +2315,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                        while (true)
 | 
					                        while (true)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            pidx++;
 | 
					                            pidx++;
 | 
				
			||||||
                            pname = $"@p{pidx}";
 | 
					                            pname = $"{ptmpPrefix}{pidx}";
 | 
				
			||||||
                            if (parms.ContainsKey(pname) == false) break;
 | 
					                            if (parms.ContainsKey(pname) == false) break;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -2326,46 +2334,72 @@ namespace FreeSql.Internal
 | 
				
			|||||||
            var remidx = sql.IndexOf("WHERE ");
 | 
					            var remidx = sql.IndexOf("WHERE ");
 | 
				
			||||||
            if (remidx != -1) sql = sql.Substring(remidx + 6);
 | 
					            if (remidx != -1) sql = sql.Substring(remidx + 6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var sidx = 0;
 | 
					            //sql = Regex.Replace(sql, @"\s*([@:\?][\w_]+)\s*(<|<=|>|>=|=)\s*((\w+)\s*\.)?([\w_]+)");
 | 
				
			||||||
            var ltcou = 0;
 | 
					            return LocalProcessBrackets(sql);
 | 
				
			||||||
            var ltidxStack = new Stack<int>();
 | 
					
 | 
				
			||||||
            while (sidx < sql.Length)
 | 
					
 | 
				
			||||||
 | 
					            string LocalProcessBrackets(string locsql)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                var chr = sql[sidx++];
 | 
					                var sidx = 0;
 | 
				
			||||||
                if (chr == '(')
 | 
					                var ltcou = 0;
 | 
				
			||||||
 | 
					                var ltidxStack = new Stack<int>();
 | 
				
			||||||
 | 
					                while (sidx < locsql.Length)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    ltcou++;
 | 
					                    var chr = locsql[sidx++];
 | 
				
			||||||
                    ltidxStack.Push(sidx - 1);
 | 
					                    if (chr == '(')
 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                if (chr == ')')
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    ltcou--;
 | 
					 | 
				
			||||||
                    var ltidx = ltidxStack.Pop();
 | 
					 | 
				
			||||||
                    if (ltidx == 0 && sidx == sql.Length - 1)
 | 
					 | 
				
			||||||
                        break;
 | 
					 | 
				
			||||||
                    var sqlLeft = ltidx == 0 ? "" : sql.Remove(ltidx);
 | 
					 | 
				
			||||||
                    var sqlMid = sql.Substring(ltidx, sidx - ltidx);
 | 
					 | 
				
			||||||
                    var sqlMidNew = "";
 | 
					 | 
				
			||||||
                    var sqlRight = sidx == sql.Length - 1 ? "" : sql.Substring(sidx + 1);
 | 
					 | 
				
			||||||
                    var mLeft = Regex.Match(sqlLeft, @" (and|or|not)\s*$", RegexOptions.IgnoreCase);
 | 
					 | 
				
			||||||
                    if (mLeft.Success)
 | 
					 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        switch (mLeft.Groups[1].Value)
 | 
					                        ltcou++;
 | 
				
			||||||
                        {
 | 
					                        ltidxStack.Push(sidx - 1);
 | 
				
			||||||
                            case "and":
 | 
					                    }
 | 
				
			||||||
                                sqlMidNew = sqlMid.Substring(1, sqlMid.Length - 2);
 | 
					                    if (chr == ')')
 | 
				
			||||||
                                break;
 | 
					                    {
 | 
				
			||||||
                            case "or":
 | 
					                        ltcou--;
 | 
				
			||||||
                                break;
 | 
					                        var ltidx = ltidxStack.Pop();
 | 
				
			||||||
                            case "not":
 | 
					                        var ltidx2 = ltidx;
 | 
				
			||||||
                                break;
 | 
					                        var sidx2 = sidx;
 | 
				
			||||||
                        }
 | 
					                        while(sidx < locsql.Length)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            var chr2 = locsql[sidx];
 | 
				
			||||||
 | 
					                            if (chr2 == ')')
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                if (ltidxStack.First() == ltidx - 1)
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    ltidx = ltidxStack.Pop();
 | 
				
			||||||
 | 
					                                    sidx++;
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        if (ltidx == 0 && sidx == locsql.Length)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            locsql = locsql.Substring(1, sidx - 2);
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        var sqlLeft = ltidx == 0 ? "" : locsql.Remove(ltidx);
 | 
				
			||||||
 | 
					                        var sqlMid = locsql.Substring(ltidx, sidx - ltidx);
 | 
				
			||||||
 | 
					                        var sqlMidNew = sqlMid;
 | 
				
			||||||
 | 
					                        var sqlRight = sidx == locsql.Length ? "" : locsql.Substring(sidx);
 | 
				
			||||||
 | 
					                        var mLeft = Regex.Match(sqlLeft, @" (and|or|not)\s*$", RegexOptions.IgnoreCase);
 | 
				
			||||||
 | 
					                        if (mLeft.Success)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            switch (mLeft.Groups[1].Value)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                case "and":
 | 
				
			||||||
 | 
					                                    sqlMidNew = sqlMid.Substring(1, sqlMid.Length - 2).Trim();
 | 
				
			||||||
 | 
					                                    break;
 | 
				
			||||||
 | 
					                                case "or":
 | 
				
			||||||
 | 
					                                    sqlMidNew = "";
 | 
				
			||||||
 | 
					                                    break;
 | 
				
			||||||
 | 
					                                case "not":
 | 
				
			||||||
 | 
					                                    break;
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        sidx -= sqlMid.Length - sqlMidNew.Length;
 | 
				
			||||||
 | 
					                        locsql = $"{sqlLeft}{sqlMidNew}{sqlRight}";
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    sidx -= sqlMid.Length - sqlMidNew.Length;
 | 
					 | 
				
			||||||
                    sql = $"{sqlLeft}{sqlMidNew}{sqlRight}";
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                return locsql;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return sql;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        static string ParseSqlWhereLevel12(string sql)
 | 
					        static string ParseSqlWhereLevel12(string sql)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user