- 增加 单条 WhereItems + GenerateCommandParameterWithLambda 参数化;

This commit is contained in:
2881099 2024-07-28 13:16:10 +08:00
parent d8965d5749
commit c0bb06e3ff
7 changed files with 45 additions and 28 deletions

View File

@ -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;
} }

View File

@ -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

View File

@ -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);
} }
} }

View File

@ -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)

View File

@ -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)})");

View File

@ -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++;
} }

View File

@ -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();