mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 增加 单条 WhereItems + GenerateCommandParameterWithLambda 参数化;
This commit is contained in:
		@@ -581,7 +581,7 @@ namespace FreeSql.Extensions.ZeroEntity
 | 
				
			|||||||
			{
 | 
								{
 | 
				
			||||||
				var alias = _tableAlias.Where(a => a.Table == _tables[_mainTableIndex]).FirstOrDefault()?.Alias;
 | 
									var alias = _tableAlias.Where(a => a.Table == _tables[_mainTableIndex]).FirstOrDefault()?.Alias;
 | 
				
			||||||
				if (!string.IsNullOrWhiteSpace(alias)) alias = $"{alias}.";
 | 
									if (!string.IsNullOrWhiteSpace(alias)) alias = $"{alias}.";
 | 
				
			||||||
				var where = _common.WhereItems(_tables[_mainTableIndex].Primarys, alias, items);
 | 
									var where = _common.WhereItems(_tables[_mainTableIndex].Primarys, alias, items, _selectProvider._params);
 | 
				
			||||||
				_select.Where(where);
 | 
									_select.Where(where);
 | 
				
			||||||
				return this;
 | 
									return this;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -951,7 +951,7 @@ ManyToMany 级联删除中间表(注意不删除外部根)
 | 
				
			|||||||
            for (var a = tracking.DeleteLog.Count - 1; a >= 0; a--)
 | 
					            for (var a = tracking.DeleteLog.Count - 1; a >= 0; a--)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                var del = _orm.Delete<object>().WithTransaction(_transaction).CommandTimeout(_commandTimeout).AsTable(tracking.DeleteLog[a].Item1.DbName);
 | 
					                var del = _orm.Delete<object>().WithTransaction(_transaction).CommandTimeout(_commandTimeout).AsTable(tracking.DeleteLog[a].Item1.DbName);
 | 
				
			||||||
                var where = (del as DeleteProvider)._commonUtils.WhereItems(tracking.DeleteLog[a].Item1.Primarys, "", tracking.DeleteLog[a].Item2);
 | 
					                var where = (del as DeleteProvider)._commonUtils.WhereItems(tracking.DeleteLog[a].Item1.Primarys, "", tracking.DeleteLog[a].Item2, (del as DeleteProvider)._params);
 | 
				
			||||||
                _cascadeAffrows += del.Where(where).ExecuteAffrows();
 | 
					                _cascadeAffrows += del.Where(where).ExecuteAffrows();
 | 
				
			||||||
                _changeReport?.AddRange(tracking.DeleteLog[a].Item2.Select(x =>
 | 
					                _changeReport?.AddRange(tracking.DeleteLog[a].Item2.Select(x =>
 | 
				
			||||||
                    new ChangeReport.ChangeInfo
 | 
					                    new ChangeReport.ChangeInfo
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,5 @@
 | 
				
			|||||||
using FreeSql.Extensions.EntityUtil;
 | 
					using FreeSql.Extensions.EntityUtil;
 | 
				
			||||||
 | 
					using FreeSql.Internal.CommonProvider;
 | 
				
			||||||
using FreeSql.Internal.Model;
 | 
					using FreeSql.Internal.Model;
 | 
				
			||||||
using System;
 | 
					using System;
 | 
				
			||||||
using System.Collections;
 | 
					using System.Collections;
 | 
				
			||||||
@@ -699,7 +700,8 @@ namespace FreeSql
 | 
				
			|||||||
                                }
 | 
					                                }
 | 
				
			||||||
                                return refitem;
 | 
					                                return refitem;
 | 
				
			||||||
                            }).ToList();
 | 
					                            }).ToList();
 | 
				
			||||||
                            var refitems = refset.Select.Where(commonUtils.WhereItems(oto.Item1.RefColumns.ToArray(), "a.", refwhereItems)).ToList();
 | 
					                            var refsetSelect = refset.Select;
 | 
				
			||||||
 | 
					                            var refitems = refsetSelect.Where(commonUtils.WhereItems(oto.Item1.RefColumns.ToArray(), "a.", refwhereItems, (refsetSelect as Select0Provider)._params)).ToList();
 | 
				
			||||||
                            LocalEach(refset, refitems, false);
 | 
					                            LocalEach(refset, refitems, false);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -739,7 +741,8 @@ namespace FreeSql
 | 
				
			|||||||
                                }
 | 
					                                }
 | 
				
			||||||
                                return refitem;
 | 
					                                return refitem;
 | 
				
			||||||
                            }).ToList();
 | 
					                            }).ToList();
 | 
				
			||||||
                            var childs = refset.Select.Where(commonUtils.WhereItems(otm.Item1.RefColumns.ToArray(), "a.", refwhereItems)).ToList();
 | 
					                            var refsetSelect = refset.Select;
 | 
				
			||||||
 | 
					                            var childs = refsetSelect.Where(commonUtils.WhereItems(otm.Item1.RefColumns.ToArray(), "a.", refwhereItems, (refsetSelect as Select0Provider)._params)).ToList();
 | 
				
			||||||
                            LocalEach(refset, childs, true);
 | 
					                            LocalEach(refset, childs, true);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -794,7 +797,8 @@ namespace FreeSql
 | 
				
			|||||||
                                }
 | 
					                                }
 | 
				
			||||||
                                return refitem;
 | 
					                                return refitem;
 | 
				
			||||||
                            }).ToList();
 | 
					                            }).ToList();
 | 
				
			||||||
                            var childs = midset.Select.Where(commonUtils.WhereItems(mtm.Item1.MiddleColumns.Take(mtm.Item1.Columns.Count).ToArray(), "a.", miditems)).ToList();
 | 
					                            var midsetSelect = midset.Select;
 | 
				
			||||||
 | 
					                            var childs = midsetSelect.Where(commonUtils.WhereItems(mtm.Item1.MiddleColumns.Take(mtm.Item1.Columns.Count).ToArray(), "a.", miditems, (midsetSelect as Select0Provider)._params)).ToList();
 | 
				
			||||||
                            LocalEach(midset, childs, true);
 | 
					                            LocalEach(midset, childs, true);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1017,7 +1017,7 @@ SELECT ");
 | 
				
			|||||||
        var deleteDict = new DeleteDictImpl(freesql);
 | 
					        var deleteDict = new DeleteDictImpl(freesql);
 | 
				
			||||||
        UpdateProvider<Dictionary<string, object>>.GetDictionaryTableInfo(source, deleteDict._deleteProvider._orm, ref deleteDict._deleteProvider._table);
 | 
					        UpdateProvider<Dictionary<string, object>>.GetDictionaryTableInfo(source, deleteDict._deleteProvider._orm, ref deleteDict._deleteProvider._table);
 | 
				
			||||||
        var primarys = UpdateDictImpl.GetPrimarys(deleteDict._deleteProvider._table, source.Keys.ToArray());
 | 
					        var primarys = UpdateDictImpl.GetPrimarys(deleteDict._deleteProvider._table, source.Keys.ToArray());
 | 
				
			||||||
        deleteDict._deleteProvider.Where(deleteDict._deleteProvider._commonUtils.WhereItems(primarys, "", new[] { source }));
 | 
					        deleteDict._deleteProvider.Where(deleteDict._deleteProvider._commonUtils.WhereItems(primarys, "", new[] { source }, deleteDict._deleteProvider._params));
 | 
				
			||||||
        return deleteDict;
 | 
					        return deleteDict;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    /// <summary>
 | 
					    /// <summary>
 | 
				
			||||||
@@ -1035,7 +1035,7 @@ SELECT ");
 | 
				
			|||||||
            var sourceFirst = source.FirstOrDefault();
 | 
					            var sourceFirst = source.FirstOrDefault();
 | 
				
			||||||
            UpdateProvider<Dictionary<string, object>>.GetDictionaryTableInfo(sourceFirst, deleteDict._deleteProvider._orm, ref deleteDict._deleteProvider._table);
 | 
					            UpdateProvider<Dictionary<string, object>>.GetDictionaryTableInfo(sourceFirst, deleteDict._deleteProvider._orm, ref deleteDict._deleteProvider._table);
 | 
				
			||||||
            var primarys = UpdateDictImpl.GetPrimarys(deleteDict._deleteProvider._table, sourceFirst.Keys.ToArray());
 | 
					            var primarys = UpdateDictImpl.GetPrimarys(deleteDict._deleteProvider._table, sourceFirst.Keys.ToArray());
 | 
				
			||||||
            deleteDict._deleteProvider.Where(deleteDict._deleteProvider._commonUtils.WhereItems(primarys, "", source));
 | 
					            deleteDict._deleteProvider.Where(deleteDict._deleteProvider._commonUtils.WhereItems(primarys, "", source, deleteDict._deleteProvider._params));
 | 
				
			||||||
            return deleteDict;
 | 
					            return deleteDict;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        foreach (var item in source)
 | 
					        foreach (var item in source)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -116,7 +116,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            return this;
 | 
					            return this;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public IDelete<T1> Where(T1 item) => this.Where(new[] { item });
 | 
					        public IDelete<T1> Where(T1 item) => this.Where(new[] { item });
 | 
				
			||||||
        public IDelete<T1> Where(IEnumerable<T1> items) => this.Where(_commonUtils.WhereItems(_table.Primarys, "", items));
 | 
					        public IDelete<T1> Where(IEnumerable<T1> items) => this.Where(_commonUtils.WhereItems(_table.Primarys, "", items, _params));
 | 
				
			||||||
        public IDelete<T1> WhereDynamic(object dywhere, bool not = false) => not == false ?
 | 
					        public IDelete<T1> WhereDynamic(object dywhere, bool not = false) => not == false ?
 | 
				
			||||||
            this.Where(_commonUtils.WhereObject(_table, "", dywhere)) :
 | 
					            this.Where(_commonUtils.WhereObject(_table, "", dywhere)) :
 | 
				
			||||||
            this.Where($"not({_commonUtils.WhereObject(_table, "", dywhere)})");
 | 
					            this.Where($"not({_commonUtils.WhereObject(_table, "", dywhere)})");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,8 +28,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
        public List<GlobalFilter.Item> _whereGlobalFilter;
 | 
					        public List<GlobalFilter.Item> _whereGlobalFilter;
 | 
				
			||||||
        public StringBuilder _set = new StringBuilder();
 | 
					        public StringBuilder _set = new StringBuilder();
 | 
				
			||||||
        public StringBuilder _setIncr = new StringBuilder();
 | 
					        public StringBuilder _setIncr = new StringBuilder();
 | 
				
			||||||
        public List<DbParameter> _params = new List<DbParameter>();
 | 
					        public List<DbParameter> _params = new List<DbParameter>(); //已经固定的
 | 
				
			||||||
        public List<DbParameter> _paramsSource = new List<DbParameter>();
 | 
					        public List<DbParameter> _paramsSource = new List<DbParameter>(); //每次ToSql重新生成的
 | 
				
			||||||
        public bool _noneParameter;
 | 
					        public bool _noneParameter;
 | 
				
			||||||
        public int _batchRowsLimit, _batchParameterLimit;
 | 
					        public int _batchRowsLimit, _batchParameterLimit;
 | 
				
			||||||
        public bool _batchAutoTransaction = true;
 | 
					        public bool _batchAutoTransaction = true;
 | 
				
			||||||
@@ -798,7 +798,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            return this;
 | 
					            return this;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public IUpdate<T1> Where(T1 item) => this.Where(new[] { item });
 | 
					        public IUpdate<T1> Where(T1 item) => this.Where(new[] { item });
 | 
				
			||||||
        public IUpdate<T1> Where(IEnumerable<T1> items) => this.Where(_commonUtils.WhereItems(_table.Primarys, "", items));
 | 
					        public IUpdate<T1> Where(IEnumerable<T1> items) => this.Where(_commonUtils.WhereItems(_table.Primarys, "", items, _params));
 | 
				
			||||||
        public IUpdate<T1> WhereDynamic(object dywhere, bool not = false) => not == false ?
 | 
					        public IUpdate<T1> WhereDynamic(object dywhere, bool not = false) => not == false ?
 | 
				
			||||||
            this.Where(_commonUtils.WhereObject(_table, "", dywhere)) :
 | 
					            this.Where(_commonUtils.WhereObject(_table, "", dywhere)) :
 | 
				
			||||||
            this.Where($"not({_commonUtils.WhereObject(_table, "", dywhere)})");
 | 
					            this.Where($"not({_commonUtils.WhereObject(_table, "", dywhere)})");
 | 
				
			||||||
@@ -1232,7 +1232,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            if (_source.Any())
 | 
					            if (_source.Any())
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (_tempPrimarys.Any() == false) throw new ArgumentException(CoreStrings.NoPrimaryKey_UseSetDto(_table.Type.DisplayCsharp()));
 | 
					                if (_tempPrimarys.Any() == false) throw new ArgumentException(CoreStrings.NoPrimaryKey_UseSetDto(_table.Type.DisplayCsharp()));
 | 
				
			||||||
                sb.Append('(').Append(_commonUtils.WhereItems(_tempPrimarys, "", _source)).Append(')');
 | 
					                sb.Append('(').Append(_commonUtils.WhereItems(_tempPrimarys, "", _source, _paramsSource)).Append(')');
 | 
				
			||||||
                andTimes++;
 | 
					                andTimes++;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -556,37 +556,50 @@ namespace FreeSql.Internal
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public string WhereItems<TEntity>(ColumnInfo[] primarys, string aliasAndDot, IEnumerable<TEntity> items)
 | 
					        public string WhereItems<TEntity>(ColumnInfo[] primarys, string aliasAndDot, IEnumerable<TEntity> items, List<DbParameter> dbParams)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (items == null || items.Any() == false) return null;
 | 
					            if (items == null || items.Any() == false) return null;
 | 
				
			||||||
            if (primarys.Any() == false) return null;
 | 
					            if (primarys.Any() == false) return null;
 | 
				
			||||||
            var its = items.Where(a => a != null).ToArray();
 | 
					            var its = items.Where(a => a != null).ToArray();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (its.Length == 1) //v3.5.100 单条支持参数化
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var filter = "";
 | 
				
			||||||
 | 
					                foreach (var pk in primarys)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var pkval = pk.GetDbValue(its[0]);
 | 
				
			||||||
 | 
					                    if (pkval == null) return null;
 | 
				
			||||||
 | 
					                    if (primarys.Length > 1) filter += " AND ";
 | 
				
			||||||
 | 
					                    filter += $"{aliasAndDot}{this.QuoteSqlName(pk.Attribute.Name)} = ";
 | 
				
			||||||
 | 
					                    if (CodeFirst.IsGenerateCommandParameterWithLambda && dbParams != null) //v3.5.100 单条支持参数化
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        AppendParamter(dbParams, null, primarys[0], primarys[0].Attribute.MapType, pkval);
 | 
				
			||||||
 | 
					                        filter += QuoteWriteParamterAdapter(primarys[0].Attribute.MapType, QuoteParamterName($"exp_{dbParams.Count}"));
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    filter += RewriteColumn(pk, GetNoneParamaterSqlValue(null, null, pk, pk.Attribute.MapType, pkval));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return primarys.Length > 1 ? filter.Remove(0, 5) : filter;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var pk1 = primarys.FirstOrDefault();
 | 
					            var pk1 = primarys.FirstOrDefault();
 | 
				
			||||||
            if (primarys.Length == 1)
 | 
					            if (primarys.Length == 1)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                var indt = its.Select(a => pk1.GetDbValue(a)).Where(a => a != null).ToArray();
 | 
					                var indt = its.Select(a => pk1.GetDbValue(a)).Where(a => a != null).ToArray();
 | 
				
			||||||
                if (indt.Any() == false) return null;
 | 
					                if (indt.Any() == false) return null;
 | 
				
			||||||
                var sbin = new StringBuilder();
 | 
					                var sbin = new StringBuilder();
 | 
				
			||||||
                sbin.Append(aliasAndDot).Append(this.QuoteSqlName(pk1.Attribute.Name));
 | 
					                sbin.Append(aliasAndDot).Append(this.QuoteSqlName(pk1.Attribute.Name)).Append(" IN (");
 | 
				
			||||||
                if (indt.Length == 1) sbin.Append(" = ").Append(RewriteColumn(pk1, GetNoneParamaterSqlValue(null, null, pk1, pk1.Attribute.MapType, indt.First())));
 | 
					                var idx = 0;
 | 
				
			||||||
                else
 | 
					                foreach (var z in indt)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    sbin.Append(" IN (");
 | 
					                    if (++idx > 500)
 | 
				
			||||||
                    var idx = 0;
 | 
					 | 
				
			||||||
                    foreach (var z in indt)
 | 
					 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        if (++idx > 500)
 | 
					                        sbin.Append(") OR ").Append(aliasAndDot).Append(this.QuoteSqlName(pk1.Attribute.Name)).Append(" IN ("); //500元素分割
 | 
				
			||||||
                        {
 | 
					                        idx = 1;
 | 
				
			||||||
                            sbin.Append(") OR ").Append(aliasAndDot).Append(this.QuoteSqlName(pk1.Attribute.Name)).Append(" IN ("); //500元素分割
 | 
					 | 
				
			||||||
                            idx = 1;
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                        if (idx > 1) sbin.Append(",");
 | 
					 | 
				
			||||||
                        sbin.Append(RewriteColumn(pk1, GetNoneParamaterSqlValue(null, null, pk1, pk1.Attribute.MapType, z)));
 | 
					 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    sbin.Append(')');
 | 
					                    if (idx > 1) sbin.Append(",");
 | 
				
			||||||
 | 
					                    sbin.Append(RewriteColumn(pk1, GetNoneParamaterSqlValue(null, null, pk1, pk1.Attribute.MapType, z)));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return sbin.ToString();
 | 
					                return sbin.Append(')').ToString();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            var dicpk = its.Length > 5 ? new Dictionary<string, bool>() : null;
 | 
					            var dicpk = its.Length > 5 ? new Dictionary<string, bool>() : null;
 | 
				
			||||||
            var sb = its.Length > 5 ? null : new StringBuilder();
 | 
					            var sb = its.Length > 5 ? null : new StringBuilder();
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user