Skip to content

Commit

Permalink
- 增加 单条 WhereItems + GenerateCommandParameterWithLambda 参数化;
Browse files Browse the repository at this point in the history
  • Loading branch information
2881099 committed Jul 28, 2024
1 parent d8965d5 commit c0bb06e
Show file tree
Hide file tree
Showing 7 changed files with 45 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -581,7 +581,7 @@ public SelectImpl Where(IEnumerable<T> items)
{
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;
}
Expand Down
2 changes: 1 addition & 1 deletion Extensions/FreeSql.Extensions.ZeroEntity/ZeroDbContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -951,7 +951,7 @@ void SaveTrackingChange(TrackingChangeInfo tracking)
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
Expand Down
10 changes: 7 additions & 3 deletions FreeSql.DbContext/DbSet/DbSetSync.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using FreeSql.Extensions.EntityUtil;
using FreeSql.Internal.CommonProvider;
using FreeSql.Internal.Model;
using System;
using System.Collections;
Expand Down Expand Up @@ -699,7 +700,8 @@ void LocalEach(DbSet<object> dbset, IEnumerable<object> items, bool isOneToOne)
}
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);
}
}
Expand Down Expand Up @@ -739,7 +741,8 @@ void LocalEach(DbSet<object> dbset, IEnumerable<object> items, bool isOneToOne)
}
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);
}
}
Expand Down Expand Up @@ -794,7 +797,8 @@ void LocalEach(DbSet<object> dbset, IEnumerable<object> items, bool isOneToOne)
}
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);
}
}
Expand Down
4 changes: 2 additions & 2 deletions FreeSql/Extensions/FreeSqlGlobalExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1017,7 +1017,7 @@ public static DeleteDictImpl DeleteDict(this IFreeSql freesql, Dictionary<string
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>
Expand All @@ -1035,7 +1035,7 @@ public static DeleteDictImpl DeleteDict(this IFreeSql freesql, IEnumerable<Dicti
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)
Expand Down
2 changes: 1 addition & 1 deletion FreeSql/Internal/CommonProvider/DeleteProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public IDelete<T1> WhereIf(bool condition, string sql, object parms = null)
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)})");
Expand Down
8 changes: 4 additions & 4 deletions FreeSql/Internal/CommonProvider/UpdateProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ public abstract partial class UpdateProvider
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;
Expand Down Expand Up @@ -798,7 +798,7 @@ public IUpdate<T1> Where(string sql, object parms = null)
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)})");
Expand Down Expand Up @@ -1232,7 +1232,7 @@ public virtual void ToSqlWhere(StringBuilder sb)
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++;
}

Expand Down
45 changes: 29 additions & 16 deletions FreeSql/Internal/CommonUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -556,37 +556,50 @@ public string WhereObject(TableInfo table, string aliasAndDot, object dywhere)
}
}

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();
Expand Down

0 comments on commit c0bb06e

Please sign in to comment.