mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 10:42:52 +08:00
- 增加 单条 WhereItems + GenerateCommandParameterWithLambda 参数化;
This commit is contained in:
parent
d8965d5749
commit
c0bb06e3ff
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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)})");
|
||||
|
@ -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++;
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user