From c0bb06e3ff94718c134b78944cf86a74a3b08b1b Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Sun, 28 Jul 2024 13:16:10 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20=E5=8D=95=E6=9D=A1=20W?= =?UTF-8?q?hereItems=20+=20GenerateCommandParameterWithLambda=20=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E5=8C=96=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ZeroDbContext.SelectImpl.cs | 2 +- .../ZeroDbContext.cs | 2 +- FreeSql.DbContext/DbSet/DbSetSync.cs | 10 +++-- FreeSql/Extensions/FreeSqlGlobalExtensions.cs | 4 +- .../Internal/CommonProvider/DeleteProvider.cs | 2 +- .../Internal/CommonProvider/UpdateProvider.cs | 8 ++-- FreeSql/Internal/CommonUtils.cs | 45 ++++++++++++------- 7 files changed, 45 insertions(+), 28 deletions(-) diff --git a/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.SelectImpl.cs b/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.SelectImpl.cs index 22509c25..3f70407b 100644 --- a/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.SelectImpl.cs +++ b/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.SelectImpl.cs @@ -581,7 +581,7 @@ namespace FreeSql.Extensions.ZeroEntity { var alias = _tableAlias.Where(a => a.Table == _tables[_mainTableIndex]).FirstOrDefault()?.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); return this; } diff --git a/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.cs b/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.cs index acf70046..2dbd8540 100644 --- a/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.cs +++ b/Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.cs @@ -951,7 +951,7 @@ ManyToMany 级联删除中间表(注意不删除外部根) for (var a = tracking.DeleteLog.Count - 1; a >= 0; a--) { var del = _orm.Delete().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(); _changeReport?.AddRange(tracking.DeleteLog[a].Item2.Select(x => new ChangeReport.ChangeInfo diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index ccbc1f72..49b0f67d 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -1,4 +1,5 @@ using FreeSql.Extensions.EntityUtil; +using FreeSql.Internal.CommonProvider; using FreeSql.Internal.Model; using System; using System.Collections; @@ -699,7 +700,8 @@ namespace FreeSql } return refitem; }).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); } } @@ -739,7 +741,8 @@ namespace FreeSql } return refitem; }).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); } } @@ -794,7 +797,8 @@ namespace FreeSql } return refitem; }).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); } } diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs index e471a667..7aafee87 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs @@ -1017,7 +1017,7 @@ SELECT "); var deleteDict = new DeleteDictImpl(freesql); UpdateProvider>.GetDictionaryTableInfo(source, deleteDict._deleteProvider._orm, ref deleteDict._deleteProvider._table); 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; } /// @@ -1035,7 +1035,7 @@ SELECT "); var sourceFirst = source.FirstOrDefault(); UpdateProvider>.GetDictionaryTableInfo(sourceFirst, deleteDict._deleteProvider._orm, ref deleteDict._deleteProvider._table); 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; } foreach (var item in source) diff --git a/FreeSql/Internal/CommonProvider/DeleteProvider.cs b/FreeSql/Internal/CommonProvider/DeleteProvider.cs index a7e17f3e..d1448fed 100644 --- a/FreeSql/Internal/CommonProvider/DeleteProvider.cs +++ b/FreeSql/Internal/CommonProvider/DeleteProvider.cs @@ -116,7 +116,7 @@ namespace FreeSql.Internal.CommonProvider return this; } public IDelete Where(T1 item) => this.Where(new[] { item }); - public IDelete Where(IEnumerable items) => this.Where(_commonUtils.WhereItems(_table.Primarys, "", items)); + public IDelete Where(IEnumerable items) => this.Where(_commonUtils.WhereItems(_table.Primarys, "", items, _params)); public IDelete WhereDynamic(object dywhere, bool not = false) => not == false ? this.Where(_commonUtils.WhereObject(_table, "", dywhere)) : this.Where($"not({_commonUtils.WhereObject(_table, "", dywhere)})"); diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 5dd85e25..3c253cb7 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -28,8 +28,8 @@ namespace FreeSql.Internal.CommonProvider public List _whereGlobalFilter; public StringBuilder _set = new StringBuilder(); public StringBuilder _setIncr = new StringBuilder(); - public List _params = new List(); - public List _paramsSource = new List(); + public List _params = new List(); //已经固定的 + public List _paramsSource = new List(); //每次ToSql重新生成的 public bool _noneParameter; public int _batchRowsLimit, _batchParameterLimit; public bool _batchAutoTransaction = true; @@ -798,7 +798,7 @@ namespace FreeSql.Internal.CommonProvider return this; } public IUpdate Where(T1 item) => this.Where(new[] { item }); - public IUpdate Where(IEnumerable items) => this.Where(_commonUtils.WhereItems(_table.Primarys, "", items)); + public IUpdate Where(IEnumerable items) => this.Where(_commonUtils.WhereItems(_table.Primarys, "", items, _params)); public IUpdate WhereDynamic(object dywhere, bool not = false) => not == false ? this.Where(_commonUtils.WhereObject(_table, "", dywhere)) : this.Where($"not({_commonUtils.WhereObject(_table, "", dywhere)})"); @@ -1232,7 +1232,7 @@ namespace FreeSql.Internal.CommonProvider if (_source.Any()) { 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++; } diff --git a/FreeSql/Internal/CommonUtils.cs b/FreeSql/Internal/CommonUtils.cs index 03ed29d9..ccea29b7 100644 --- a/FreeSql/Internal/CommonUtils.cs +++ b/FreeSql/Internal/CommonUtils.cs @@ -556,37 +556,50 @@ namespace FreeSql.Internal } } - public string WhereItems(ColumnInfo[] primarys, string aliasAndDot, IEnumerable items) + public string WhereItems(ColumnInfo[] primarys, string aliasAndDot, IEnumerable items, List dbParams) { if (items == null || items.Any() == false) return null; if (primarys.Any() == false) return null; 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(); if (primarys.Length == 1) { var indt = its.Select(a => pk1.GetDbValue(a)).Where(a => a != null).ToArray(); if (indt.Any() == false) return null; var sbin = new StringBuilder(); - sbin.Append(aliasAndDot).Append(this.QuoteSqlName(pk1.Attribute.Name)); - if (indt.Length == 1) sbin.Append(" = ").Append(RewriteColumn(pk1, GetNoneParamaterSqlValue(null, null, pk1, pk1.Attribute.MapType, indt.First()))); - else + sbin.Append(aliasAndDot).Append(this.QuoteSqlName(pk1.Attribute.Name)).Append(" IN ("); + var idx = 0; + foreach (var z in indt) { - sbin.Append(" IN ("); - var idx = 0; - foreach (var z in indt) + if (++idx > 500) { - if (++idx > 500) - { - 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(") OR ").Append(aliasAndDot).Append(this.QuoteSqlName(pk1.Attribute.Name)).Append(" IN ("); //500元素分割 + idx = 1; } - 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() : null; var sb = its.Length > 5 ? null : new StringBuilder();