From ecd7425be91c8d3c8cec624533b6813a0f3e85eb Mon Sep 17 00:00:00 2001
From: 2881099 <2881099@qq.com>
Date: Mon, 26 Oct 2020 02:48:10 +0800
Subject: [PATCH] - add Oracle ToSqlBatchIdentityColumn
---
FreeSql.DbContext/FreeSql.DbContext.xml | 7 +
FreeSql/Extensions/FreeSqlGlobalExtensions.cs | 2 +-
FreeSql/FreeSql.xml | 187 ------------------
.../Curd/OracleInsert.cs | 72 +++++++
4 files changed, 80 insertions(+), 188 deletions(-)
diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index d198eb6c..ab4c3bf2 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -130,6 +130,13 @@
清空状态数据
+
+
+ 根据 lambda 条件删除数据
+
+
+
+
添加
diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs
index 7925f280..75c679ca 100644
--- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs
+++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs
@@ -131,7 +131,7 @@ public static partial class FreeSqlGlobalExtensions
if (that == null) return null;
if (that == typeof(string)) return default(string);
if (that == typeof(Guid)) return default(Guid);
- if (that.IsArray) return Array.CreateInstance(that, 0);
+ if (that.IsArray) return Array.CreateInstance(that.GetElementType(), 0);
if (that.IsInterface || that.IsAbstract) return null;
var ctorParms = that.InternalGetTypeConstructor0OrFirst(false)?.GetParameters();
if (ctorParms == null || ctorParms.Any() == false) return Activator.CreateInstance(that, true);
diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml
index d3216e1f..fb99c6a7 100644
--- a/FreeSql/FreeSql.xml
+++ b/FreeSql/FreeSql.xml
@@ -4514,190 +4514,3 @@
-essions.Expression{System.Func{``0,``1,``2,``3,``4,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,``1,``2,``3,``4,System.Boolean}})">
-
- 使用 and 拼接两个 lambda 表达式
-
-
-
-
-
- 使用 and 拼接两个 lambda 表达式
-
-
- true 时生效
-
-
-
-
-
- 使用 or 拼接两个 lambda 表达式
-
-
-
-
-
- 使用 or 拼接两个 lambda 表达式
-
-
- true 时生效
-
-
-
-
-
- 将 lambda 表达式取反
-
-
- true 时生效
-
-
-
-
- 生成类似Mongodb的ObjectId有序、不重复Guid
-
-
-
-
-
- 插入数据
-
-
-
-
-
-
- 插入数据,传入实体
-
-
-
-
-
-
-
- 插入数据,传入实体数组
-
-
-
-
-
-
-
- 插入数据,传入实体集合
-
-
-
-
-
-
-
- 插入数据,传入实体集合
-
-
-
-
-
-
-
- 插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下:
- MySql 5.6+: on duplicate key update
- PostgreSQL 9.4+: on conflict do update
- SqlServer 2008+: merge into
- Oracle 11+: merge into
- Sqlite: replace into
- 达梦: merge into
- 人大金仓:on conflict do update
- 神通:merge into
- MsAccess:不支持
- 注意区别:FreeSql.Repository 仓储也有 InsertOrUpdate 方法(不依赖数据库特性)
-
-
-
-
-
-
- 修改数据
-
-
-
-
-
-
- 修改数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
-
-
- 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合
-
-
-
-
- 查询数据
-
-
-
-
-
-
- 查询数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
-
-
- 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合
-
-
-
-
- 删除数据
-
-
-
-
-
-
- 删除数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
-
-
- 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合
-
-
-
-
- 开启事务(不支持异步)
- v1.5.0 关闭了线程事务超时自动提交的机制
-
- 事务体 () => {}
-
-
-
- 开启事务(不支持异步)
- v1.5.0 关闭了线程事务超时自动提交的机制
-
-
- 事务体 () => {}
-
-
-
- 数据库访问对象
-
-
-
-
- 所有拦截方法都在这里
-
-
-
-
- CodeFirst 模式开发相关方法
-
-
-
-
- DbFirst 模式开发相关方法
-
-
-
-
- 全局过滤设置,可默认附加为 Select/Update/Delete 条件
-
-
-
-
diff --git a/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs
index be0e5b0e..e7f68355 100644
--- a/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs
+++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs
@@ -23,6 +23,78 @@ namespace FreeSql.Oracle.Curd
public override long ExecuteIdentity() => base.SplitExecuteIdentity(_batchValuesLimit > 0 ? _batchValuesLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 999);
public override List ExecuteInserted() => base.SplitExecuteInserted(_batchValuesLimit > 0 ? _batchValuesLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 999);
+ ///
+ /// 批量插入时,如果有序列 + DbInsertValue 设置,则用这个
+ ///
+ ///
+ public string ToSqlBatchIdentityColumn()
+ {
+ if (_source == null || _source.Any() == false) return null;
+ var cols = new List();
+ foreach (var col in _table.Columns.Values)
+ {
+ if (col.Attribute.IsIdentity && _insertIdentity == false && string.IsNullOrEmpty(col.DbInsertValue)) continue;
+ if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name)) continue;
+
+ cols.Add(col);
+ }
+
+ _identCol = null;
+ var sb = new StringBuilder();
+ var tmpsb = new StringBuilder();
+ sb.Append("INSERT INTO ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append("(");
+ var colidx = 0;
+ foreach (var col in cols)
+ {
+ if (col.Attribute.IsIdentity) _identCol = col;
+ if (colidx > 0)
+ {
+ sb.Append(", ");
+ tmpsb.Append(", ");
+ }
+ var colname = _commonUtils.QuoteSqlName(col.Attribute.Name);
+ sb.Append(colname);
+ tmpsb.Append(col.Attribute.IsIdentity && !string.IsNullOrEmpty(col.DbInsertValue) ? col.DbInsertValue : colname);
+ ++colidx;
+ }
+ sb.Append(") ").Append("\r\nSELECT ").Append(tmpsb.ToString()).Append(" FROM \r\n(\r\n");
+ tmpsb.Clear();
+
+ _params = _noneParameter ? new DbParameter[0] : new DbParameter[colidx * _source.Count];
+ var specialParams = new List();
+ var didx = 0;
+ foreach (var d in _source)
+ {
+ if (_source.Count > 1) sb.Append("\r\n UNION ALL\r\n ");
+ sb.Append(" SELECT ");
+ var colidx2 = 0;
+ foreach (var col in cols)
+ {
+ if (colidx2 > 0) sb.Append(", ");
+ if (string.IsNullOrEmpty(col.DbInsertValue) == false)
+ sb.Append(col.DbInsertValue);
+ else
+ {
+ object val = col.GetDbValue(d);
+ if (val == null && col.Attribute.IsNullable == false) val = col.CsType == typeof(string) ? "" : Utils.GetDataReaderValue(col.CsType.NullableTypeOrThis(), null);//#384
+ if (_noneParameter)
+ sb.Append(_commonUtils.GetNoneParamaterSqlValue(specialParams, _noneParameterFlag, col.Attribute.MapType, val));
+ else
+ {
+ sb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"{col.CsName}_{didx}")));
+ _params[didx * colidx + colidx2] = _commonUtils.AppendParamter(null, $"{col.CsName}_{didx}", col, col.Attribute.MapType, val);
+ }
+ }
+ if (didx == 0) sb.Append(" as ").Append(col.Attribute.Name);
+ ++colidx2;
+ }
+ sb.Append(" FROM dual ");
+ ++didx;
+ }
+ sb.Append(")");
+ if (_noneParameter && specialParams.Any()) _params = specialParams.ToArray();
+ return sb.ToString();
+ }
public override string ToSql()
{