diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 807dc336..9f25ee32 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1073,6 +1073,82 @@ + + + 动态创建实体类型 + + + + + 配置Class + + 类名 + 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] + + + + + 配置属性 + + 属性名称 + 属性类型 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性默认值 + 属性标记的特性-支持多个 + + + + + 配置父类 + + 父类类型 + + + + + Override属性 + + + + + + Emit动态创建出Class - Type + + + + + + 首字母小写 + + + + + + + 首字母大写 + + + + 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -5700,6 +5776,28 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 + + + 动态构建Class Type + + + + + + 根据字典,创建 table 对应的实体对象 + + + + + + + + 根据实体对象,创建 table 对应的字典 + + + + + C#: that >= between && that <= and diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 4593f830..02a8c04d 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -894,28 +894,30 @@ namespace FreeSql.Internal.CommonProvider var sb = new StringBuilder(); sb.Append(_commonUtils.QuoteSqlName(col.Attribute.Name)).Append(" = "); - string valsqlOld = null; - var valsqlOldStats = 1; //start 1 - var nullStats = 0; - var cwsb = new StringBuilder().Append(cw); - foreach (var d in _source) + var valsameIf = col.Attribute.MapType.IsNumberType() || col.Attribute.MapType == typeof(string) || col.Attribute.MapType.NullableTypeOrThis().IsEnum; + var ds = _source.Select(a => col.GetDbValue(a)).ToArray(); + if (valsameIf && ds.All(a => object.Equals(a, ds[0]))) { - cwsb.Append(" \r\nWHEN "); - ToSqlWhen(cwsb, _tempPrimarys, d); - cwsb.Append(" THEN "); - var val = col.GetDbValue(d); - var valsql = thenValue(_commonUtils.RewriteColumn(col, _commonUtils.GetNoneParamaterSqlValue(_paramsSource, "u", col, col.Attribute.MapType, val))); - cwsb.Append(valsql); - if (valsqlOld == null) valsqlOld = valsql; - else if (valsqlOld == valsql) valsqlOldStats++; - if (val == null || val == DBNull.Value) nullStats++; + var val = ds.First(); + var colsql = thenValue(_commonUtils.RewriteColumn(col, _commonUtils.GetNoneParamaterSqlValue(_paramsSource, "u", col, col.Attribute.MapType, val))); + sb.Append(colsql); + } + else + { + var cwsb = new StringBuilder().Append(cw); + foreach (var d in _source) + { + cwsb.Append(" \r\nWHEN "); + ToSqlWhen(cwsb, _tempPrimarys, d); + cwsb.Append(" THEN "); + var val = col.GetDbValue(d); + var colsql = thenValue(_commonUtils.RewriteColumn(col, _commonUtils.GetNoneParamaterSqlValue(_paramsSource, "u", col, col.Attribute.MapType, val))); + cwsb.Append(colsql); + } + cwsb.Append(" END"); + sb.Append(cwsb); + cwsb.Clear(); } - cwsb.Append(" END"); - if (nullStats == _source.Count) sb.Append("NULL"); - else if (valsqlOldStats == _source.Count) sb.Append(valsqlOld); - else sb.Append(cwsb); - cwsb.Clear(); - return sb.ToString(); } } @@ -1147,30 +1149,39 @@ namespace FreeSql.Internal.CommonProvider sb.Append(col.DbUpdateValue); else { - var nulls = 0; - var cwsb = new StringBuilder().Append(cw); - foreach (var d in _source) + var valsameIf = col.Attribute.MapType.IsNumberType() || col.Attribute.MapType == typeof(string) || col.Attribute.MapType.NullableTypeOrThis().IsEnum; + var ds = _source.Select(a => col.GetDbValue(a)).ToArray(); + if (valsameIf && ds.All(a => object.Equals(a, ds[0]))) { - cwsb.Append(" \r\nWHEN "); - ToSqlWhen(cwsb, _tempPrimarys, d); - cwsb.Append(" THEN "); - var val = col.GetDbValue(d); - + var val = ds.First(); var colsql = _noneParameter ? _commonUtils.GetNoneParamaterSqlValue(_paramsSource, "u", col, col.Attribute.MapType, val) : _commonUtils.QuoteWriteParamterAdapter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"p_{_paramsSource.Count}")); - cwsb.Append(_commonUtils.RewriteColumn(col, colsql)); + sb.Append(_commonUtils.RewriteColumn(col, colsql)); if (_noneParameter == false) _commonUtils.AppendParamter(_paramsSource, null, col, col.Attribute.MapType, val); - if (val == null || val == DBNull.Value) nulls++; } - cwsb.Append(" END"); - if (nulls == _source.Count) sb.Append("NULL"); else { + var cwsb = new StringBuilder().Append(cw); + foreach (var d in _source) + { + cwsb.Append(" \r\nWHEN "); + ToSqlWhen(cwsb, _tempPrimarys, d); + cwsb.Append(" THEN "); + var val = col.GetDbValue(d); + + var colsql = _noneParameter ? _commonUtils.GetNoneParamaterSqlValue(_paramsSource, "u", col, col.Attribute.MapType, val) : + _commonUtils.QuoteWriteParamterAdapter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"p_{_paramsSource.Count}")); + colsql = _commonUtils.RewriteColumn(col, colsql); + cwsb.Append(colsql); + if (_noneParameter == false) + _commonUtils.AppendParamter(_paramsSource, null, col, col.Attribute.MapType, val); + } + cwsb.Append(" END"); ToSqlCaseWhenEnd(cwsb, col); sb.Append(cwsb); + cwsb.Clear(); } - cwsb.Clear(); } ++colidx; }