- 增加 单条 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;
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;
}

View File

@ -951,7 +951,7 @@ ManyToMany 级联删除中间表(注意不删除外部根)
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 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

View File

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

View File

@ -1017,7 +1017,7 @@ SELECT ");
var deleteDict = new DeleteDictImpl(freesql);
UpdateProvider<Dictionary<string, object>>.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;
}
/// <summary>
@ -1035,7 +1035,7 @@ SELECT ");
var sourceFirst = source.FirstOrDefault();
UpdateProvider<Dictionary<string, object>>.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)

View File

@ -116,7 +116,7 @@ namespace FreeSql.Internal.CommonProvider
return this;
}
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 ?
this.Where(_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 StringBuilder _set = new StringBuilder();
public StringBuilder _setIncr = new StringBuilder();
public List<DbParameter> _params = new List<DbParameter>();
public List<DbParameter> _paramsSource = new List<DbParameter>();
public List<DbParameter> _params = new List<DbParameter>(); //已经固定的
public List<DbParameter> _paramsSource = new List<DbParameter>(); //每次ToSql重新生成的
public bool _noneParameter;
public int _batchRowsLimit, _batchParameterLimit;
public bool _batchAutoTransaction = true;
@ -798,7 +798,7 @@ namespace FreeSql.Internal.CommonProvider
return this;
}
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 ?
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++;
}

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 (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<string, bool>() : null;
var sb = its.Length > 5 ? null : new StringBuilder();