From 1250f4f3af0f515a64c7da5a2886c4ce42381762 Mon Sep 17 00:00:00 2001
From: 2881099 <2881099@qq.com>
Date: Wed, 24 May 2023 13:04:34 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20IUpdate=20=E6=89=B9?=
=?UTF-8?q?=E9=87=8F=20case=20when=20=E5=90=8C=E5=80=BC=E7=9A=84=20SQL=20?=
=?UTF-8?q?=E7=94=9F=E6=88=90=EF=BC=9B#1393?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FreeSql/FreeSql.xml | 98 +++++++++++++++++++
.../Internal/CommonProvider/UpdateProvider.cs | 77 ++++++++-------
2 files changed, 142 insertions(+), 33 deletions(-)
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;
}