mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 10:42:52 +08:00
- 增加 单条 WhereObject + GenerateCommandParameterWithLambda 参数化;
This commit is contained in:
parent
c0bb06e3ff
commit
934be9cd9f
@ -722,13 +722,5 @@
|
||||
<param name="that"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Reflection.Assembly[])">
|
||||
<summary>
|
||||
批量注入 Repository,可以参考代码自行调整
|
||||
</summary>
|
||||
<param name="services"></param>
|
||||
<param name="assemblies"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
</members>
|
||||
</doc>
|
||||
|
File diff suppressed because one or more lines are too long
@ -37,7 +37,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
_commonExpression = commonExpression;
|
||||
_table = _commonUtils.GetTableByEntity(typeof(T1));
|
||||
_isAutoSyncStructure = _orm.CodeFirst.IsAutoSyncStructure;
|
||||
this.Where(_commonUtils.WhereObject(_table, "", dywhere));
|
||||
this.Where(_commonUtils.WhereObject(_table, "", dywhere, _params));
|
||||
if (_isAutoSyncStructure && typeof(T1) != typeof(object)) _orm.CodeFirst.SyncStructure<T1>();
|
||||
_whereGlobalFilter = _orm.GlobalFilter.GetFilters();
|
||||
}
|
||||
@ -118,8 +118,8 @@ namespace FreeSql.Internal.CommonProvider
|
||||
public IDelete<T1> Where(T1 item) => this.Where(new[] { item });
|
||||
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)})");
|
||||
this.Where(_commonUtils.WhereObject(_table, "", dywhere, _params)) :
|
||||
this.Where($"not({_commonUtils.WhereObject(_table, "", dywhere, _params)})");
|
||||
public IDelete<T1> WhereDynamicFilter(DynamicFilterInfo filter)
|
||||
{
|
||||
var alias = "t_" + Guid.NewGuid().ToString("n").Substring(0, 8);
|
||||
|
@ -564,7 +564,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
_commonUtils = commonUtils;
|
||||
_commonExpression = commonExpression;
|
||||
_tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T1)), Alias = "a", On = null, Type = SelectTableInfoType.From });
|
||||
this.Where(_commonUtils.WhereObject(_tables.First().Table, "a.", dywhere));
|
||||
this.Where(_commonUtils.WhereObject(_tables.First().Table, "a.", dywhere, _params));
|
||||
if (_orm.CodeFirst.IsAutoSyncStructure && typeof(T1) != typeof(object)) _orm.CodeFirst.SyncStructure<T1>();
|
||||
}
|
||||
|
||||
|
@ -503,7 +503,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
.Where(oldwhere)
|
||||
.WhereIf(string.IsNullOrWhiteSpace(newwhere) == false, $"not({newwhere})");
|
||||
}
|
||||
var wheresql = _commonUtils.WhereObject(_tables.First().Table, $"{_tables.First().Alias}.", dywhere);
|
||||
var wheresql = _commonUtils.WhereObject(_tables.First().Table, $"{_tables.First().Alias}.", dywhere, _params);
|
||||
return not == false ? this.Where(wheresql) : this.Where($"not({wheresql})");
|
||||
}
|
||||
|
||||
|
@ -182,7 +182,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
_versionColumn = _table?.VersionColumn;
|
||||
_noneParameter = _orm.CodeFirst.IsNoneCommandParameter;
|
||||
_isAutoSyncStructure = _orm.CodeFirst.IsAutoSyncStructure;
|
||||
this.Where(_commonUtils.WhereObject(_table, "", dywhere));
|
||||
this.Where(_commonUtils.WhereObject(_table, "", dywhere, _params));
|
||||
if (_isAutoSyncStructure && typeof(T1) != typeof(object)) _orm.CodeFirst.SyncStructure<T1>();
|
||||
IgnoreCanUpdate();
|
||||
_whereGlobalFilter = _orm.GlobalFilter.GetFilters();
|
||||
@ -800,8 +800,8 @@ namespace FreeSql.Internal.CommonProvider
|
||||
public IUpdate<T1> Where(T1 item) => this.Where(new[] { item });
|
||||
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)})");
|
||||
this.Where(_commonUtils.WhereObject(_table, "", dywhere, _params)) :
|
||||
this.Where($"not({_commonUtils.WhereObject(_table, "", dywhere, _params)})");
|
||||
public IUpdate<T1> WhereDynamicFilter(DynamicFilterInfo filter)
|
||||
{
|
||||
var alias = "t_" + Guid.NewGuid().ToString("n").Substring(0, 8);
|
||||
|
@ -458,35 +458,53 @@ namespace FreeSql.Internal
|
||||
}
|
||||
return ret.Values.ToArray();
|
||||
}
|
||||
|
||||
public string WhereObject(TableInfo table, string aliasAndDot, object dywhere)
|
||||
public string WhereObject(TableInfo table, string aliasAndDot, object dywhere, List<DbParameter> dbParams)
|
||||
{
|
||||
string LocalGetFilterSql(ColumnInfo[] cols, object[] objs)
|
||||
{
|
||||
string filter = "";
|
||||
var colidx = 0;
|
||||
foreach (var col in cols)
|
||||
{
|
||||
var colval = Utils.GetDataReaderValue(col.Attribute.MapType, objs[colidx]);
|
||||
filter += $"{(colidx > 0 ? " AND " : "")}{aliasAndDot}{this.QuoteSqlName(col.Attribute.Name)} = ";
|
||||
if (CodeFirst.IsGenerateCommandParameterWithLambda && dbParams != null) //v3.5.100 单条支持参数化
|
||||
{
|
||||
AppendParamter(dbParams, null, col, col.Attribute.MapType, colval);
|
||||
filter += RewriteColumn(col, QuoteWriteParamterAdapter(col.Attribute.MapType, QuoteParamterName($"exp_{dbParams.Count}")));
|
||||
}
|
||||
else
|
||||
filter += RewriteColumn(col, GetNoneParamaterSqlValue(null, null, col, col.Attribute.MapType, colval));
|
||||
++colidx;
|
||||
}
|
||||
return filter;
|
||||
}
|
||||
object LocalGetSingleElement(IEnumerable ie)
|
||||
{
|
||||
var idx = 0;
|
||||
object firstElement = null;
|
||||
foreach (var i in ie)
|
||||
{
|
||||
if (i == null) continue;
|
||||
if (idx == 0) firstElement = i;
|
||||
++idx;
|
||||
if (idx > 1) break;
|
||||
}
|
||||
return idx == 1 ? firstElement : null;
|
||||
}
|
||||
|
||||
if (dywhere == null) return "";
|
||||
var type = dywhere.GetType();
|
||||
var primarys = table.Primarys;
|
||||
var pk1 = primarys.FirstOrDefault();
|
||||
if (primarys.Length == 1 && (type == pk1.CsType || type.IsNumberType() && pk1.CsType.IsNumberType()))
|
||||
{
|
||||
return $"{aliasAndDot}{this.QuoteSqlName(pk1.Attribute.Name)} = {RewriteColumn(pk1, GetNoneParamaterSqlValue(null, null, pk1, pk1.Attribute.MapType, Utils.GetDataReaderValue(pk1.Attribute.MapType, dywhere)))}";
|
||||
}
|
||||
else if (primarys.Length > 0 && (type == table.Type || type.BaseType == table.Type))
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
var pkidx = 0;
|
||||
foreach (var pk in primarys)
|
||||
{
|
||||
if (pkidx > 0) sb.Append(" AND ");
|
||||
sb.Append(aliasAndDot).Append(this.QuoteSqlName(pk.Attribute.Name)).Append(" = ");
|
||||
sb.Append(RewriteColumn(pk, GetNoneParamaterSqlValue(null, null, pk, pk.Attribute.MapType, pk.GetDbValue(dywhere))));
|
||||
++pkidx;
|
||||
}
|
||||
return sb.ToString();
|
||||
}
|
||||
else if (primarys.Length == 1 && type == typeof(string))
|
||||
{
|
||||
return $"{aliasAndDot}{this.QuoteSqlName(pk1.Attribute.Name)} = {RewriteColumn(pk1, GetNoneParamaterSqlValue(null, null, pk1, pk1.Attribute.MapType, Utils.GetDataReaderValue(pk1.Attribute.MapType, dywhere)))}";
|
||||
}
|
||||
else if (primarys.Length == 1 && dywhere is IEnumerable)
|
||||
return LocalGetFilterSql(primarys, new object[] { dywhere });
|
||||
if (primarys.Length > 0 && (type == table.Type || type.BaseType == table.Type))
|
||||
return LocalGetFilterSql(primarys, primarys.Select(pk => pk.GetDbValue(dywhere)).ToArray());
|
||||
if (primarys.Length == 1 && type == typeof(string))
|
||||
return LocalGetFilterSql(primarys, new object[] { dywhere });
|
||||
|
||||
if (primarys.Length == 1 && dywhere is IEnumerable)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
var ie = dywhere as IEnumerable;
|
||||
@ -509,25 +527,27 @@ namespace FreeSql.Internal
|
||||
idx = 1;
|
||||
}
|
||||
if (idx > 1) sb.Append(",");
|
||||
var val = isEntityType ? RewriteColumn(primarys[0], GetNoneParamaterSqlValue(null, null, primarys[0], primarys[0].Attribute.MapType, primarys[0].GetDbValue(i))) :
|
||||
RewriteColumn(pk1, GetNoneParamaterSqlValue(null, null, pk1, pk1.Attribute.MapType, Utils.GetDataReaderValue(pk1.Attribute.MapType, i)));
|
||||
sb.Append(val);
|
||||
if (ieidx == 0) ieidx1ret = $"{aliasAndDot}{this.QuoteSqlName(pk1.Attribute.Name)} = {val}";
|
||||
ieidx++;
|
||||
var pkval = isEntityType ? pk1.GetDbValue(i) : i;
|
||||
if (ieidx == 0) ieidx1ret = LocalGetFilterSql(new[] { pk1 }, new object[] { pkval });
|
||||
sb.Append(RewriteColumn(pk1, GetNoneParamaterSqlValue(null, null, pk1, pk1.Attribute.MapType, pkval)));
|
||||
++ieidx;
|
||||
}
|
||||
if (ieidx == 0) return "";
|
||||
if (ieidx == 1) return ieidx1ret;
|
||||
sb.Append(')');
|
||||
return sb.ToString();
|
||||
}
|
||||
else if (dywhere is IEnumerable)
|
||||
if (dywhere is IEnumerable)
|
||||
{
|
||||
|
||||
var sb = new StringBuilder();
|
||||
var ie = dywhere as IEnumerable;
|
||||
var ieSingle = LocalGetSingleElement(ie);
|
||||
if (ieSingle != null) return WhereObject(table, aliasAndDot, ieSingle, dbParams);
|
||||
var ieidx = 0;
|
||||
foreach (var i in ie)
|
||||
{
|
||||
var fw = WhereObject(table, aliasAndDot, i);
|
||||
var fw = WhereObject(table, aliasAndDot, i, dbParams);
|
||||
if (string.IsNullOrEmpty(fw)) continue;
|
||||
if (ieidx > 0) sb.Append(" OR ");
|
||||
sb.Append(fw);
|
||||
@ -547,8 +567,7 @@ namespace FreeSql.Internal
|
||||
if (trycol == null) continue;
|
||||
|
||||
if (psidx > 0) sb.Append(" AND ");
|
||||
sb.Append(aliasAndDot).Append(this.QuoteSqlName(trycol.Attribute.Name)).Append(" = ");
|
||||
sb.Append(RewriteColumn(trycol, GetNoneParamaterSqlValue(null, null, trycol, trycol.Attribute.MapType, Utils.GetDataReaderValue(trycol.Attribute.MapType, p.GetValue(dywhere, null)))));
|
||||
sb.Append(LocalGetFilterSql(new[] { trycol }, new object[] { p.GetValue(dywhere, null) }));
|
||||
++psidx;
|
||||
}
|
||||
if (psidx == 0) return "";
|
||||
@ -574,9 +593,10 @@ namespace FreeSql.Internal
|
||||
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, QuoteWriteParamterAdapter(primarys[0].Attribute.MapType, QuoteParamterName($"exp_{dbParams.Count}")));
|
||||
}
|
||||
filter += RewriteColumn(pk, GetNoneParamaterSqlValue(null, null, pk, pk.Attribute.MapType, pkval));
|
||||
else
|
||||
filter += RewriteColumn(pk, GetNoneParamaterSqlValue(null, null, pk, pk.Attribute.MapType, pkval));
|
||||
}
|
||||
return primarys.Length > 1 ? filter.Remove(0, 5) : filter;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user