mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	修正命名 NaviteTuple 为 NativeTuple
This commit is contained in:
		@@ -78,19 +78,19 @@ namespace FreeSql
 | 
				
			|||||||
        protected virtual void OnModelCreating(ICodeFirst codefirst) { }
 | 
					        protected virtual void OnModelCreating(ICodeFirst codefirst) { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #region Set
 | 
					        #region Set
 | 
				
			||||||
        static ConcurrentDictionary<Type, NaviteTuple<PropertyInfo[], bool>> _dicGetDbSetProps = new ConcurrentDictionary<Type, NaviteTuple<PropertyInfo[], bool>>();
 | 
					        static ConcurrentDictionary<Type, NativeTuple<PropertyInfo[], bool>> _dicGetDbSetProps = new ConcurrentDictionary<Type, NativeTuple<PropertyInfo[], bool>>();
 | 
				
			||||||
        internal void InitPropSets()
 | 
					        internal void InitPropSets()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var thisType = this.GetType();
 | 
					            var thisType = this.GetType();
 | 
				
			||||||
            var dicval = _dicGetDbSetProps.GetOrAdd(thisType, tp =>
 | 
					            var dicval = _dicGetDbSetProps.GetOrAdd(thisType, tp =>
 | 
				
			||||||
                NaviteTuple.Create(
 | 
					                NativeTuple.Create(
 | 
				
			||||||
                    tp.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public)
 | 
					                    tp.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public)
 | 
				
			||||||
                        .Where(a => a.PropertyType.IsGenericType &&
 | 
					                        .Where(a => a.PropertyType.IsGenericType &&
 | 
				
			||||||
                            a.PropertyType == typeof(DbSet<>).MakeGenericType(a.PropertyType.GetGenericArguments()[0])).ToArray(),
 | 
					                            a.PropertyType == typeof(DbSet<>).MakeGenericType(a.PropertyType.GetGenericArguments()[0])).ToArray(),
 | 
				
			||||||
                    false));
 | 
					                    false));
 | 
				
			||||||
            if (dicval.Item2 == false)
 | 
					            if (dicval.Item2 == false)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (_dicGetDbSetProps.TryUpdate(thisType, NaviteTuple.Create(dicval.Item1, true), dicval))
 | 
					                if (_dicGetDbSetProps.TryUpdate(thisType, NativeTuple.Create(dicval.Item1, true), dicval))
 | 
				
			||||||
                    OnModelCreating(OrmOriginal.CodeFirst);
 | 
					                    OnModelCreating(OrmOriginal.CodeFirst);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,13 @@
 | 
				
			|||||||
using FreeSql.Extensions.EntityUtil;
 | 
					using FreeSql.Extensions.EntityUtil;
 | 
				
			||||||
 | 
					using FreeSql.Internal.Model;
 | 
				
			||||||
using System;
 | 
					using System;
 | 
				
			||||||
using System.Collections;
 | 
					using System.Collections;
 | 
				
			||||||
using System.Collections.Generic;
 | 
					 | 
				
			||||||
using System.Collections.Concurrent;
 | 
					using System.Collections.Concurrent;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
using System.Linq;
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Linq.Expressions;
 | 
				
			||||||
using System.Reflection;
 | 
					using System.Reflection;
 | 
				
			||||||
using System.Text;
 | 
					using System.Text;
 | 
				
			||||||
using System.Linq.Expressions;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace FreeSql
 | 
					namespace FreeSql
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -539,82 +540,85 @@ namespace FreeSql
 | 
				
			|||||||
        /// 开始编辑数据,然后调用方法 EndEdit 分析出添加、修改、删除 SQL 语句进行执行<para></para>
 | 
					        /// 开始编辑数据,然后调用方法 EndEdit 分析出添加、修改、删除 SQL 语句进行执行<para></para>
 | 
				
			||||||
        /// 场景:winform 加载表数据后,一顿添加、修改、删除操作之后,最后才点击【保存】<para></para><para></para>
 | 
					        /// 场景:winform 加载表数据后,一顿添加、修改、删除操作之后,最后才点击【保存】<para></para><para></para>
 | 
				
			||||||
        /// 示例:https://github.com/dotnetcore/FreeSql/issues/397<para></para>
 | 
					        /// 示例:https://github.com/dotnetcore/FreeSql/issues/397<para></para>
 | 
				
			||||||
 | 
					        /// 注意:* 本方法只支持单表操作,不支持导航属性级联保存
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <param name="data"></param>
 | 
					        /// <param name="data"></param>
 | 
				
			||||||
        //public void BeginEdit(List<TEntity> data)
 | 
					        public void BeginEdit(List<TEntity> data)
 | 
				
			||||||
        //{
 | 
					        {
 | 
				
			||||||
        //    if (data == null || data.Any() == false) return;
 | 
					            if (data == null || data.Any() == false) return;
 | 
				
			||||||
        //    if (_table.Primarys.Any() == false) throw new Exception($"不可进行编辑,实体没有主键:{_db.OrmOriginal.GetEntityString(_entityType, data.First())}");
 | 
					            if (_table.Primarys.Any() == false) throw new Exception($"不可进行编辑,实体没有主键:{_db.OrmOriginal.GetEntityString(_entityType, data.First())}");
 | 
				
			||||||
        //    _statesEditing.Clear();
 | 
					            _statesEditing.Clear();
 | 
				
			||||||
        //    _dataEditing = data;
 | 
					            _dataEditing = data;
 | 
				
			||||||
        //    foreach (var item in data)
 | 
					            foreach (var item in data)
 | 
				
			||||||
        //    {
 | 
					            {
 | 
				
			||||||
        //        var key = _db.OrmOriginal.GetEntityKeyString(_entityType, item, false);
 | 
					                var key = _db.OrmOriginal.GetEntityKeyString(_entityType, item, false);
 | 
				
			||||||
        //        if (string.IsNullOrEmpty(key)) continue;
 | 
					                if (string.IsNullOrEmpty(key)) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //        _statesEditing.AddOrUpdate(key, k => CreateEntityState(item), (k, ov) =>
 | 
					                _statesEditing.AddOrUpdate(key, k => CreateEntityState(item), (k, ov) =>
 | 
				
			||||||
        //        {
 | 
					                {
 | 
				
			||||||
        //            _db.OrmOriginal.MapEntityValue(_entityType, item, ov.Value);
 | 
					                    _db.OrmOriginal.MapEntityValue(_entityType, item, ov.Value);
 | 
				
			||||||
        //            ov.Time = DateTime.Now;
 | 
					                    ov.Time = DateTime.Now;
 | 
				
			||||||
        //            return ov;
 | 
					                    return ov;
 | 
				
			||||||
        //        });
 | 
					                });
 | 
				
			||||||
        //    }
 | 
					            }
 | 
				
			||||||
        //}
 | 
					        }
 | 
				
			||||||
        ///// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        ///// 完成编辑数据,进行保存动作<para></para>
 | 
					        /// 完成编辑数据,进行保存动作<para></para>
 | 
				
			||||||
        ///// 该方法根据 BeginEdit 传入的状态分析出添加、修改、删除 SQL 语句
 | 
					        /// 该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句<para></para>
 | 
				
			||||||
        ///// </summary>
 | 
					        /// 注意:* 本方法只支持单表操作,不支持导航属性级联保存
 | 
				
			||||||
        ///// <returns></returns>
 | 
					        /// </summary>
 | 
				
			||||||
        //public int EndEdit()
 | 
					        /// <returns></returns>
 | 
				
			||||||
        //{
 | 
					        public int EndEdit()
 | 
				
			||||||
        //    var beforeAffrows = 0;
 | 
					        {
 | 
				
			||||||
        //    if (_dataEditing == null) return 0;
 | 
					            var beforeAffrows = 0;
 | 
				
			||||||
        //    var oldEnable = _db.Options.EnableAddOrUpdateNavigateList;
 | 
					            if (_dataEditing == null) return 0;
 | 
				
			||||||
        //    _db.Options.EnableAddOrUpdateNavigateList = false;
 | 
					            var oldEnable = _db.Options.EnableAddOrUpdateNavigateList;
 | 
				
			||||||
        //    try
 | 
					            _db.Options.EnableAddOrUpdateNavigateList = false;
 | 
				
			||||||
        //    {
 | 
					            try
 | 
				
			||||||
        //        DbContextFlushCommand();
 | 
					            {
 | 
				
			||||||
        //        var addList = new List<TEntity>();
 | 
					                DbContextFlushCommand();
 | 
				
			||||||
        //        var ediList = new List<TEntity>();
 | 
					                var addList = new List<TEntity>();
 | 
				
			||||||
        //        foreach (var item in _dataEditing)
 | 
					                var ediList = new List<NativeTuple<TEntity, string>>();
 | 
				
			||||||
        //        {
 | 
					                foreach (var item in _dataEditing)
 | 
				
			||||||
        //            var key = _db.OrmOriginal.GetEntityKeyString(_entityType, item, false);
 | 
					                {
 | 
				
			||||||
        //            if (_statesEditing.TryRemove(key, out var state) == false)
 | 
					                    var key = _db.OrmOriginal.GetEntityKeyString(_entityType, item, false);
 | 
				
			||||||
        //            {
 | 
					                    if (_statesEditing.TryRemove(key, out var state) == false)
 | 
				
			||||||
        //                addList.Add(item);
 | 
					                    {
 | 
				
			||||||
        //                continue;
 | 
					                        addList.Add(item);
 | 
				
			||||||
        //            }
 | 
					                        continue;
 | 
				
			||||||
        //            _states.AddOrUpdate(key, k => state, (k, ov) =>
 | 
					                    }
 | 
				
			||||||
        //            {
 | 
					                    _states.AddOrUpdate(key, k => state, (k, ov) =>
 | 
				
			||||||
        //                ov.Value = state.Value;
 | 
					                    {
 | 
				
			||||||
        //                ov.Time = DateTime.Now;
 | 
					                        ov.Value = state.Value;
 | 
				
			||||||
        //                return ov;
 | 
					                        ov.Time = DateTime.Now;
 | 
				
			||||||
        //            });
 | 
					                        return ov;
 | 
				
			||||||
        //            if (_db.OrmOriginal.CompareEntityValueReturnColumns(_entityType, item, state.Value, false).Any())
 | 
					                    });
 | 
				
			||||||
        //                ediList.Add(item);
 | 
					                    var edicmp = _db.OrmOriginal.CompareEntityValueReturnColumns(_entityType, item, state.Value, false);
 | 
				
			||||||
        //        }
 | 
					                    if (edicmp.Any())
 | 
				
			||||||
        //        beforeAffrows = _db._affrows;
 | 
					                        ediList.Add(NativeTuple.Create(item, string.Join(",", edicmp)));
 | 
				
			||||||
        //        AddRange(addList);
 | 
					                }
 | 
				
			||||||
        //        UpdateRange(ediList);
 | 
					                beforeAffrows = _db._affrows;
 | 
				
			||||||
 | 
					                AddRange(addList);
 | 
				
			||||||
 | 
					                UpdateRange(ediList.OrderBy(a => a.Item2).Select(a => a.Item1).ToList());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //        DbContextFlushCommand();
 | 
					                DbContextFlushCommand();
 | 
				
			||||||
        //        var delList = _statesEditing.Values.OrderBy(a => a.Time).ToArray();
 | 
					                var delList = _statesEditing.Values.OrderBy(a => a.Time).ToArray();
 | 
				
			||||||
        //        _db._affrows += DbContextBatchRemove(delList); //为了减的少不必要的开销,此处没有直接调用 RemoveRange
 | 
					                _db._affrows += DbContextBatchRemove(delList); //为了减的少不必要的开销,此处没有直接调用 RemoveRange
 | 
				
			||||||
        //        foreach (var state in delList)
 | 
					                foreach (var state in delList)
 | 
				
			||||||
        //        {
 | 
					                {
 | 
				
			||||||
        //            _db.OrmOriginal.ClearEntityPrimaryValueWithIdentityAndGuid(_entityType, state.Value);
 | 
					                    _db.OrmOriginal.ClearEntityPrimaryValueWithIdentityAndGuid(_entityType, state.Value);
 | 
				
			||||||
        //            _states.TryRemove(state.Key, out var oldstate);
 | 
					                    _states.TryRemove(state.Key, out var oldstate);
 | 
				
			||||||
        //        }
 | 
					                }
 | 
				
			||||||
        //        DbContextFlushCommand();
 | 
					                DbContextFlushCommand();
 | 
				
			||||||
        //    }
 | 
					            }
 | 
				
			||||||
        //    finally
 | 
					            finally
 | 
				
			||||||
        //    {
 | 
					            {
 | 
				
			||||||
        //        _dataEditing = null;
 | 
					                _dataEditing = null;
 | 
				
			||||||
        //        _statesEditing.Clear();
 | 
					                _statesEditing.Clear();
 | 
				
			||||||
        //        _db.Options.EnableAddOrUpdateNavigateList = oldEnable;
 | 
					                _db.Options.EnableAddOrUpdateNavigateList = oldEnable;
 | 
				
			||||||
        //    }
 | 
					            }
 | 
				
			||||||
        //    return _db._affrows - beforeAffrows;
 | 
					            return _db._affrows - beforeAffrows;
 | 
				
			||||||
        //}
 | 
					        }
 | 
				
			||||||
        #endregion
 | 
					        #endregion
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -125,13 +125,6 @@
 | 
				
			|||||||
            清空状态数据
 | 
					            清空状态数据
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.DbSet`1.RemoveAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            根据 lambda 条件删除数据
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="predicate"></param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.DbSet`1.Add(`0)">
 | 
					        <member name="M:FreeSql.DbSet`1.Add(`0)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            添加
 | 
					            添加
 | 
				
			||||||
@@ -174,6 +167,23 @@
 | 
				
			|||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
            <param name="data"></param>
 | 
					            <param name="data"></param>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.DbSet`1.BeginEdit(System.Collections.Generic.List{`0})">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            开始编辑数据,然后调用方法 EndEdit 分析出添加、修改、删除 SQL 语句进行执行<para></para>
 | 
				
			||||||
 | 
					            场景:winform 加载表数据后,一顿添加、修改、删除操作之后,最后才点击【保存】<para></para><para></para>
 | 
				
			||||||
 | 
					            示例:https://github.com/dotnetcore/FreeSql/issues/397<para></para>
 | 
				
			||||||
 | 
					            注意:* 本方法只支持单表操作,不支持导航属性级联保存
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="data"></param>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.DbSet`1.EndEdit">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            完成编辑数据,进行保存动作<para></para>
 | 
				
			||||||
 | 
					            该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句<para></para>
 | 
				
			||||||
 | 
					            注意:* 本方法只支持单表操作,不支持导航属性级联保存
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.Extensions.EfCoreFluentApi.EfCoreColumnFluent.Help">
 | 
					        <member name="M:FreeSql.Extensions.EfCoreFluentApi.EfCoreColumnFluent.Help">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            使用 FreeSql FluentApi 方法,当 EFCore FluentApi 方法无法表示的时候使用
 | 
					            使用 FreeSql FluentApi 方法,当 EFCore FluentApi 方法无法表示的时候使用
 | 
				
			||||||
@@ -304,6 +314,23 @@
 | 
				
			|||||||
            <param name="entity">实体对象</param>
 | 
					            <param name="entity">实体对象</param>
 | 
				
			||||||
            <param name="propertyName">属性名</param>
 | 
					            <param name="propertyName">属性名</param>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IBaseRepository`1.BeginEdit(System.Collections.Generic.List{`0})">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            开始编辑数据,然后调用方法 EndEdit 分析出添加、修改、删除 SQL 语句进行执行<para></para>
 | 
				
			||||||
 | 
					            场景:winform 加载表数据后,一顿添加、修改、删除操作之后,最后才点击【保存】<para></para><para></para>
 | 
				
			||||||
 | 
					            示例:https://github.com/dotnetcore/FreeSql/issues/397<para></para>
 | 
				
			||||||
 | 
					            注意:* 本方法只支持单表操作,不支持导航属性级联保存
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="data"></param>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IBaseRepository`1.EndEdit">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            完成编辑数据,进行保存动作<para></para>
 | 
				
			||||||
 | 
					            该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句<para></para>
 | 
				
			||||||
 | 
					            注意:* 本方法只支持单表操作,不支持导航属性级联保存
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
        <member name="T:FreeSql.IUnitOfWork">
 | 
					        <member name="T:FreeSql.IUnitOfWork">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            工作单元
 | 
					            工作单元
 | 
				
			||||||
@@ -486,14 +513,5 @@
 | 
				
			|||||||
            <param name="that"></param>
 | 
					            <param name="that"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            批量注入 Repository,可以参考代码自行调整
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="services"></param>
 | 
					 | 
				
			||||||
            <param name="globalDataFilter"></param>
 | 
					 | 
				
			||||||
            <param name="assemblies"></param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
    </members>
 | 
					    </members>
 | 
				
			||||||
</doc>
 | 
					</doc>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -119,11 +119,11 @@ namespace FreeSql
 | 
				
			|||||||
            return _db.SaveChanges();
 | 
					            return _db.SaveChanges();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public void Attach(TEntity data) => _db.Attach(data);
 | 
					        public void Attach(TEntity data) => _dbset.Attach(data);
 | 
				
			||||||
        public void Attach(IEnumerable<TEntity> data) => _db.AttachRange(data);
 | 
					        public void Attach(IEnumerable<TEntity> data) => _dbset.AttachRange(data);
 | 
				
			||||||
        public IBaseRepository<TEntity> AttachOnlyPrimary(TEntity data)
 | 
					        public IBaseRepository<TEntity> AttachOnlyPrimary(TEntity data)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            _db.AttachOnlyPrimary(data);
 | 
					            _dbset.AttachOnlyPrimary(data);
 | 
				
			||||||
            return this;
 | 
					            return this;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public void FlushState() => _dbset.FlushState();
 | 
					        public void FlushState() => _dbset.FlushState();
 | 
				
			||||||
@@ -140,6 +140,9 @@ namespace FreeSql
 | 
				
			|||||||
            _dbset.SaveMany(entity, propertyName);
 | 
					            _dbset.SaveMany(entity, propertyName);
 | 
				
			||||||
            _db.SaveChanges();
 | 
					            _db.SaveChanges();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public void BeginEdit(List<TEntity> data) => _dbset.BeginEdit(data);
 | 
				
			||||||
 | 
					        public int EndEdit() => _dbset.EndEdit();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public abstract partial class BaseRepository<TEntity, TKey> : BaseRepository<TEntity>, IBaseRepository<TEntity, TKey>
 | 
					    public abstract partial class BaseRepository<TEntity, TKey> : BaseRepository<TEntity>, IBaseRepository<TEntity, TKey>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -79,6 +79,22 @@ namespace FreeSql
 | 
				
			|||||||
        int Delete(IEnumerable<TEntity> entitys);
 | 
					        int Delete(IEnumerable<TEntity> entitys);
 | 
				
			||||||
        int Delete(Expression<Func<TEntity, bool>> predicate);
 | 
					        int Delete(Expression<Func<TEntity, bool>> predicate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 开始编辑数据,然后调用方法 EndEdit 分析出添加、修改、删除 SQL 语句进行执行<para></para>
 | 
				
			||||||
 | 
					        /// 场景:winform 加载表数据后,一顿添加、修改、删除操作之后,最后才点击【保存】<para></para><para></para>
 | 
				
			||||||
 | 
					        /// 示例:https://github.com/dotnetcore/FreeSql/issues/397<para></para>
 | 
				
			||||||
 | 
					        /// 注意:* 本方法只支持单表操作,不支持导航属性级联保存
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="data"></param>
 | 
				
			||||||
 | 
					        void BeginEdit(List<TEntity> data);
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 完成编辑数据,进行保存动作<para></para>
 | 
				
			||||||
 | 
					        /// 该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句<para></para>
 | 
				
			||||||
 | 
					        /// 注意:* 本方法只支持单表操作,不支持导航属性级联保存
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        int EndEdit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if net40
 | 
					#if net40
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
        Task<TEntity> InsertAsync(TEntity entity);
 | 
					        Task<TEntity> InsertAsync(TEntity entity);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -528,5 +528,35 @@ namespace FreeSql.Tests
 | 
				
			|||||||
            public Guid TagId { get; set; }
 | 
					            public Guid TagId { get; set; }
 | 
				
			||||||
            public Tag Tag { get; set; }
 | 
					            public Tag Tag { get; set; }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void BeginEdit()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            g.sqlite.Delete<BeginEdit01>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					            var repo = g.sqlite.GetRepository<BeginEdit01>();
 | 
				
			||||||
 | 
					            var cts = new[] {
 | 
				
			||||||
 | 
					                new BeginEdit01 { Name = "<22><><EFBFBD><EFBFBD>1" },
 | 
				
			||||||
 | 
					                new BeginEdit01 { Name = "<22><><EFBFBD><EFBFBD>1_1" },
 | 
				
			||||||
 | 
					                new BeginEdit01 { Name = "<22><><EFBFBD><EFBFBD>1_2" },
 | 
				
			||||||
 | 
					                new BeginEdit01 { Name = "<22><><EFBFBD><EFBFBD>1_3" },
 | 
				
			||||||
 | 
					                new BeginEdit01 { Name = "<22><><EFBFBD><EFBFBD>2" },
 | 
				
			||||||
 | 
					                new BeginEdit01 { Name = "<22><><EFBFBD><EFBFBD>2_1" },
 | 
				
			||||||
 | 
					                new BeginEdit01 { Name = "<22><><EFBFBD><EFBFBD>2_2" }
 | 
				
			||||||
 | 
					            }.ToList();
 | 
				
			||||||
 | 
					            repo.Insert(cts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            repo.BeginEdit(cts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            cts.Add(new BeginEdit01 { Name = "<22><><EFBFBD><EFBFBD>2_3" });
 | 
				
			||||||
 | 
					            cts[0].Name = "123123";
 | 
				
			||||||
 | 
					            cts.RemoveAt(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal(3, repo.EndEdit());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        class BeginEdit01
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public Guid Id { get; set; }
 | 
				
			||||||
 | 
					            public string Name { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -68,21 +68,21 @@ namespace FreeSql.Tests
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            using (var ctx = g.sqlite.CreateDbContext())
 | 
					            using (var ctx = g.sqlite.CreateDbContext())
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                //var setTag = ctx.Set<Tag>();
 | 
					                var setTag = ctx.Set<Tag>();
 | 
				
			||||||
                //var tags = setTag.Select.Limit(10).ToList();
 | 
					                var tags = setTag.Select.Limit(10).ToList();
 | 
				
			||||||
                //setTag.BeginEdit(tags);
 | 
					                setTag.BeginEdit(tags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                //tags.Add(new Tag
 | 
					                tags.Add(new Tag
 | 
				
			||||||
                //{
 | 
					                {
 | 
				
			||||||
                //    Ddd = DateTime.Now.Second,
 | 
					                    Ddd = DateTime.Now.Second,
 | 
				
			||||||
                //    Name = "test_manytoMany_01_<31>й<EFBFBD>2234234"
 | 
					                    Name = "test_manytoMany_01_<31>й<EFBFBD>2234234"
 | 
				
			||||||
                //});
 | 
					                });
 | 
				
			||||||
                //tags[0].Name = "123123";
 | 
					                tags[0].Name = "123123";
 | 
				
			||||||
                //tags.RemoveAt(1);
 | 
					                tags.RemoveAt(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                //tags.Clear();
 | 
					                //tags.Clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                //Assert.Equal(10, setTag.EndEdit());
 | 
					                Assert.Equal(3, setTag.EndEdit());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var test150_02 = ctx.Set<Tag>()
 | 
					                var test150_02 = ctx.Set<Tag>()
 | 
				
			||||||
                    .Select.From<Tag>((s, b) => s.InnerJoin(a => a.Id == b.Id))
 | 
					                    .Select.From<Tag>((s, b) => s.InnerJoin(a => a.Id == b.Id))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,7 @@ namespace FreeSql
 | 
				
			|||||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, bool>> exp);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, bool>> exp);
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, bool>> exp);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, bool>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>> GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TKey>> exp);
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>> GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TKey>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TMember>> column);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TMember>> column);
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TMember>> column);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TMember>> column);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,7 @@ namespace FreeSql
 | 
				
			|||||||
        ISelect<T1, T2> Where(Expression<Func<T1, T2, bool>> exp);
 | 
					        ISelect<T1, T2> Where(Expression<Func<T1, T2, bool>> exp);
 | 
				
			||||||
        ISelect<T1, T2> WhereIf(bool condition, Expression<Func<T1, T2, bool>> exp);
 | 
					        ISelect<T1, T2> WhereIf(bool condition, Expression<Func<T1, T2, bool>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2>> GroupBy<TKey>(Expression<Func<T1, T2, TKey>> exp);
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2>> GroupBy<TKey>(Expression<Func<T1, T2, TKey>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelect<T1, T2> OrderBy<TMember>(Expression<Func<T1, T2, TMember>> column);
 | 
					        ISelect<T1, T2> OrderBy<TMember>(Expression<Func<T1, T2, TMember>> column);
 | 
				
			||||||
        ISelect<T1, T2> OrderByDescending<TMember>(Expression<Func<T1, T2, TMember>> column);
 | 
					        ISelect<T1, T2> OrderByDescending<TMember>(Expression<Func<T1, T2, TMember>> column);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,7 @@ namespace FreeSql
 | 
				
			|||||||
        ISelect<T1, T2, T3> Where(Expression<Func<T1, T2, T3, bool>> exp);
 | 
					        ISelect<T1, T2, T3> Where(Expression<Func<T1, T2, T3, bool>> exp);
 | 
				
			||||||
        ISelect<T1, T2, T3> WhereIf(bool condition, Expression<Func<T1, T2, T3, bool>> exp);
 | 
					        ISelect<T1, T2, T3> WhereIf(bool condition, Expression<Func<T1, T2, T3, bool>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2, T3>> GroupBy<TKey>(Expression<Func<T1, T2, T3, TKey>> exp);
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2, T3>> GroupBy<TKey>(Expression<Func<T1, T2, T3, TKey>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelect<T1, T2, T3> OrderBy<TMember>(Expression<Func<T1, T2, T3, TMember>> column);
 | 
					        ISelect<T1, T2, T3> OrderBy<TMember>(Expression<Func<T1, T2, T3, TMember>> column);
 | 
				
			||||||
        ISelect<T1, T2, T3> OrderByDescending<TMember>(Expression<Func<T1, T2, T3, TMember>> column);
 | 
					        ISelect<T1, T2, T3> OrderByDescending<TMember>(Expression<Func<T1, T2, T3, TMember>> column);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,7 @@ namespace FreeSql
 | 
				
			|||||||
        ISelect<T1, T2, T3, T4> Where(Expression<Func<T1, T2, T3, T4, bool>> exp);
 | 
					        ISelect<T1, T2, T3, T4> Where(Expression<Func<T1, T2, T3, T4, bool>> exp);
 | 
				
			||||||
        ISelect<T1, T2, T3, T4> WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, bool>> exp);
 | 
					        ISelect<T1, T2, T3, T4> WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, bool>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2, T3, T4>> GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, TKey>> exp);
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4>> GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, TKey>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelect<T1, T2, T3, T4> OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, TMember>> column);
 | 
					        ISelect<T1, T2, T3, T4> OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, TMember>> column);
 | 
				
			||||||
        ISelect<T1, T2, T3, T4> OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, TMember>> column);
 | 
					        ISelect<T1, T2, T3, T4> OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, TMember>> column);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,7 @@ namespace FreeSql
 | 
				
			|||||||
        ISelect<T1, T2, T3, T4, T5> Where(Expression<Func<T1, T2, T3, T4, T5, bool>> exp);
 | 
					        ISelect<T1, T2, T3, T4, T5> Where(Expression<Func<T1, T2, T3, T4, T5, bool>> exp);
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5> WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, bool>> exp);
 | 
					        ISelect<T1, T2, T3, T4, T5> WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, bool>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2, T3, T4, T5>> GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, TKey>> exp);
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5>> GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, TKey>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5> OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, TMember>> column);
 | 
					        ISelect<T1, T2, T3, T4, T5> OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, TMember>> column);
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5> OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, TMember>> column);
 | 
					        ISelect<T1, T2, T3, T4, T5> OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, TMember>> column);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,7 @@ namespace FreeSql
 | 
				
			|||||||
        ISelect<T1, T2, T3, T4, T5, T6> Where(Expression<Func<T1, T2, T3, T4, T5, T6, bool>> exp);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6> Where(Expression<Func<T1, T2, T3, T4, T5, T6, bool>> exp);
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5, T6> WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, bool>> exp);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6> WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, bool>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6>> GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, TKey>> exp);
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5, T6>> GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, TKey>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5, T6> OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, TMember>> column);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6> OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, TMember>> column);
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5, T6> OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, TMember>> column);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6> OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, TMember>> column);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,7 @@ namespace FreeSql
 | 
				
			|||||||
        ISelect<T1, T2, T3, T4, T5, T6, T7> Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, bool>> exp);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6, T7> Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, bool>> exp);
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5, T6, T7> WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, bool>> exp);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6, T7> WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, bool>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6, T7>> GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TKey>> exp);
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7>> GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TKey>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5, T6, T7> OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TMember>> column);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6, T7> OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TMember>> column);
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5, T6, T7> OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TMember>> column);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6, T7> OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TMember>> column);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,7 @@ namespace FreeSql
 | 
				
			|||||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8> Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, bool>> exp);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6, T7, T8> Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, bool>> exp);
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8> WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, bool>> exp);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6, T7, T8> WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, bool>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8>> GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TKey>> exp);
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8>> GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TKey>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8> OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TMember>> column);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6, T7, T8> OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TMember>> column);
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8> OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TMember>> column);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6, T7, T8> OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TMember>> column);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,7 @@ namespace FreeSql
 | 
				
			|||||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, bool>> exp);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, bool>> exp);
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, bool>> exp);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, bool>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>> GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TKey>> exp);
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>> GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TKey>> exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TMember>> column);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TMember>> column);
 | 
				
			||||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TMember>> column);
 | 
					        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TMember>> column);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -199,9 +199,9 @@ namespace FreeSql
 | 
				
			|||||||
        /// <param name="cmdText"></param>
 | 
					        /// <param name="cmdText"></param>
 | 
				
			||||||
        /// <param name="cmdParms"></param>
 | 
					        /// <param name="cmdParms"></param>
 | 
				
			||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>> Query<T1, T2>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        NativeTuple<List<T1>, List<T2>> Query<T1, T2>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>> Query<T1, T2>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        NativeTuple<List<T1>, List<T2>> Query<T1, T2>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>> Query<T1, T2>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        NativeTuple<List<T1>, List<T2>> Query<T1, T2>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 执行SQL返回对象集合,Query<User>("select * from user where age > ?age; select * from address", new { age = 25 })<para></para>
 | 
					        /// 执行SQL返回对象集合,Query<User>("select * from user where age > ?age; select * from address", new { age = 25 })<para></para>
 | 
				
			||||||
        /// 提示:parms 参数还可以传 Dictionary<string, object>
 | 
					        /// 提示:parms 参数还可以传 Dictionary<string, object>
 | 
				
			||||||
@@ -210,28 +210,28 @@ namespace FreeSql
 | 
				
			|||||||
        /// <param name="cmdText"></param>
 | 
					        /// <param name="cmdText"></param>
 | 
				
			||||||
        /// <param name="parms"></param>
 | 
					        /// <param name="parms"></param>
 | 
				
			||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>> Query<T1, T2>(string cmdText, object parms = null);
 | 
					        NativeTuple<List<T1>, List<T2>> Query<T1, T2>(string cmdText, object parms = null);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>> Query<T1, T2>(DbTransaction transaction, string cmdText, object parms = null);
 | 
					        NativeTuple<List<T1>, List<T2>> Query<T1, T2>(DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>> Query<T1, T2>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
 | 
					        NativeTuple<List<T1>, List<T2>> Query<T1, T2>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(string cmdText, object parms = null);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(string cmdText, object parms = null);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(DbTransaction transaction, string cmdText, object parms = null);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(string cmdText, object parms = null);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(string cmdText, object parms = null);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(DbTransaction transaction, string cmdText, object parms = null);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(string cmdText, object parms = null);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(string cmdText, object parms = null);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(DbTransaction transaction, string cmdText, object parms = null);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
        NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
 | 
					        NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if net40
 | 
					#if net40
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
@@ -380,9 +380,9 @@ namespace FreeSql
 | 
				
			|||||||
        /// <param name="cmdText"></param>
 | 
					        /// <param name="cmdText"></param>
 | 
				
			||||||
        /// <param name="cmdParms"></param>
 | 
					        /// <param name="cmdParms"></param>
 | 
				
			||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        Task<NativeTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        Task<NativeTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        Task<NativeTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 执行SQL返回对象集合,Query<User, Address>("select * from user where age > ?age; select * from address", new { age = 25 })<para></para>
 | 
					        /// 执行SQL返回对象集合,Query<User, Address>("select * from user where age > ?age; select * from address", new { age = 25 })<para></para>
 | 
				
			||||||
        /// 提示:parms 参数还可以传 Dictionary<string, object>
 | 
					        /// 提示:parms 参数还可以传 Dictionary<string, object>
 | 
				
			||||||
@@ -391,28 +391,28 @@ namespace FreeSql
 | 
				
			|||||||
        /// <param name="cmdText"></param>
 | 
					        /// <param name="cmdText"></param>
 | 
				
			||||||
        /// <param name="parms"></param>
 | 
					        /// <param name="parms"></param>
 | 
				
			||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(string cmdText, object parms = null);
 | 
					        Task<NativeTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(string cmdText, object parms = null);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(DbTransaction transaction, string cmdText, object parms = null);
 | 
					        Task<NativeTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
 | 
					        Task<NativeTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(string cmdText, object parms = null);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(string cmdText, object parms = null);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(DbTransaction transaction, string cmdText, object parms = null);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(string cmdText, object parms = null);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(string cmdText, object parms = null);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(DbTransaction transaction, string cmdText, object parms = null);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(string cmdText, object parms = null);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(string cmdText, object parms = null);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(DbTransaction transaction, string cmdText, object parms = null);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
        Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
 | 
					        Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
        #endregion
 | 
					        #endregion
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -130,14 +130,14 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            return ret;
 | 
					            return ret;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        #region query multi
 | 
					        #region query multi
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>> Query<T1, T2>(string cmdText, object parms = null) => Query<T1, T2>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public NativeTuple<List<T1>, List<T2>> Query<T1, T2>(string cmdText, object parms = null) => Query<T1, T2>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>> Query<T1, T2>(DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public NativeTuple<List<T1>, List<T2>> Query<T1, T2>(DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>> Query<T1, T2>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public NativeTuple<List<T1>, List<T2>> Query<T1, T2>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>> Query<T1, T2>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2>(null, null, cmdType, cmdText, cmdParms);
 | 
					        public NativeTuple<List<T1>, List<T2>> Query<T1, T2>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2>(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>> Query<T1, T2>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2>(null, transaction, cmdType, cmdText, cmdParms);
 | 
					        public NativeTuple<List<T1>, List<T2>> Query<T1, T2>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2>(null, transaction, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>> Query<T1, T2>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
					        public NativeTuple<List<T1>, List<T2>> Query<T1, T2>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (string.IsNullOrEmpty(cmdText)) return NaviteTuple.Create(new List<T1>(), new List<T2>());
 | 
					            if (string.IsNullOrEmpty(cmdText)) return NativeTuple.Create(new List<T1>(), new List<T2>());
 | 
				
			||||||
            var ret1 = new List<T1>();
 | 
					            var ret1 = new List<T1>();
 | 
				
			||||||
            var type1 = typeof(T1);
 | 
					            var type1 = typeof(T1);
 | 
				
			||||||
            string flag1 = null;
 | 
					            string flag1 = null;
 | 
				
			||||||
@@ -189,17 +189,17 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return NaviteTuple.Create(ret1, ret2);
 | 
					            return NativeTuple.Create(ret1, ret2);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(string cmdText, object parms = null) => Query<T1, T2, T3>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(string cmdText, object parms = null) => Query<T1, T2, T3>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3>(null, null, cmdType, cmdText, cmdParms);
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3>(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3>(null, transaction, cmdType, cmdText, cmdParms);
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3>(null, transaction, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (string.IsNullOrEmpty(cmdText)) return NaviteTuple.Create(new List<T1>(), new List<T2>(), new List<T3>());
 | 
					            if (string.IsNullOrEmpty(cmdText)) return NativeTuple.Create(new List<T1>(), new List<T2>(), new List<T3>());
 | 
				
			||||||
            var ret1 = new List<T1>();
 | 
					            var ret1 = new List<T1>();
 | 
				
			||||||
            var type1 = typeof(T1);
 | 
					            var type1 = typeof(T1);
 | 
				
			||||||
            string flag1 = null;
 | 
					            string flag1 = null;
 | 
				
			||||||
@@ -274,17 +274,17 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return NaviteTuple.Create(ret1, ret2, ret3);
 | 
					            return NativeTuple.Create(ret1, ret2, ret3);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(string cmdText, object parms = null) => Query<T1, T2, T3, T4>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(string cmdText, object parms = null) => Query<T1, T2, T3, T4>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3, T4>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3, T4>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3, T4>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3, T4>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3, T4>(null, null, cmdType, cmdText, cmdParms);
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3, T4>(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3, T4>(null, transaction, cmdType, cmdText, cmdParms);
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3, T4>(null, transaction, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (string.IsNullOrEmpty(cmdText)) return NaviteTuple.Create(new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>());
 | 
					            if (string.IsNullOrEmpty(cmdText)) return NativeTuple.Create(new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>());
 | 
				
			||||||
            var ret1 = new List<T1>();
 | 
					            var ret1 = new List<T1>();
 | 
				
			||||||
            var type1 = typeof(T1);
 | 
					            var type1 = typeof(T1);
 | 
				
			||||||
            string flag1 = null;
 | 
					            string flag1 = null;
 | 
				
			||||||
@@ -382,17 +382,17 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return NaviteTuple.Create(ret1, ret2, ret3, ret4);
 | 
					            return NativeTuple.Create(ret1, ret2, ret3, ret4);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(string cmdText, object parms = null) => Query<T1, T2, T3, T4, T5>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(string cmdText, object parms = null) => Query<T1, T2, T3, T4, T5>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3, T4, T5>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3, T4, T5>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3, T4, T5>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3, T4, T5>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3, T4, T5>(null, null, cmdType, cmdText, cmdParms);
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3, T4, T5>(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3, T4, T5>(null, transaction, cmdType, cmdText, cmdParms);
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3, T4, T5>(null, transaction, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
					        public NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (string.IsNullOrEmpty(cmdText)) return NaviteTuple.Create(new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>(), new List<T5>());
 | 
					            if (string.IsNullOrEmpty(cmdText)) return NativeTuple.Create(new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>(), new List<T5>());
 | 
				
			||||||
            var ret1 = new List<T1>();
 | 
					            var ret1 = new List<T1>();
 | 
				
			||||||
            var type1 = typeof(T1);
 | 
					            var type1 = typeof(T1);
 | 
				
			||||||
            string flag1 = null;
 | 
					            string flag1 = null;
 | 
				
			||||||
@@ -513,7 +513,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return NaviteTuple.Create(ret1, ret2, ret3, ret4, ret5);
 | 
					            return NativeTuple.Create(ret1, ret2, ret3, ret4, ret5);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        #endregion
 | 
					        #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,14 +51,14 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            return ret;
 | 
					            return ret;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        #region QueryAsync multi
 | 
					        #region QueryAsync multi
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(string cmdText, object parms = null) => QueryAsync<T1, T2>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public Task<NativeTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(string cmdText, object parms = null) => QueryAsync<T1, T2>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public Task<NativeTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public Task<NativeTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2>(null, null, cmdType, cmdText, cmdParms);
 | 
					        public Task<NativeTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2>(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2>(null, transaction, cmdType, cmdText, cmdParms);
 | 
					        public Task<NativeTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2>(null, transaction, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        async public Task<NaviteTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
					        async public Task<NativeTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (string.IsNullOrEmpty(cmdText)) return NaviteTuple.Create(new List<T1>(), new List<T2>());
 | 
					            if (string.IsNullOrEmpty(cmdText)) return NativeTuple.Create(new List<T1>(), new List<T2>());
 | 
				
			||||||
            var ret1 = new List<T1>();
 | 
					            var ret1 = new List<T1>();
 | 
				
			||||||
            var type1 = typeof(T1);
 | 
					            var type1 = typeof(T1);
 | 
				
			||||||
            string flag1 = null;
 | 
					            string flag1 = null;
 | 
				
			||||||
@@ -111,17 +111,17 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                return Task.FromResult(false);
 | 
					                return Task.FromResult(false);
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return NaviteTuple.Create(ret1, ret2);
 | 
					            return NativeTuple.Create(ret1, ret2);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(string cmdText, object parms = null) => QueryAsync<T1, T2, T3>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public Task<NativeTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(string cmdText, object parms = null) => QueryAsync<T1, T2, T3>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public Task<NativeTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public Task<NativeTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3>(null, null, cmdType, cmdText, cmdParms);
 | 
					        public Task<NativeTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3>(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3>(null, transaction, cmdType, cmdText, cmdParms);
 | 
					        public Task<NativeTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3>(null, transaction, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        async public Task<NaviteTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
					        async public Task<NativeTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (string.IsNullOrEmpty(cmdText)) return NaviteTuple.Create(new List<T1>(), new List<T2>(), new List<T3>());
 | 
					            if (string.IsNullOrEmpty(cmdText)) return NativeTuple.Create(new List<T1>(), new List<T2>(), new List<T3>());
 | 
				
			||||||
            var ret1 = new List<T1>();
 | 
					            var ret1 = new List<T1>();
 | 
				
			||||||
            var type1 = typeof(T1);
 | 
					            var type1 = typeof(T1);
 | 
				
			||||||
            string flag1 = null;
 | 
					            string flag1 = null;
 | 
				
			||||||
@@ -197,17 +197,17 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                return Task.FromResult(false);
 | 
					                return Task.FromResult(false);
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return NaviteTuple.Create(ret1, ret2, ret3);
 | 
					            return NativeTuple.Create(ret1, ret2, ret3);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3, T4>(null, null, cmdType, cmdText, cmdParms);
 | 
					        public Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3, T4>(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3, T4>(null, transaction, cmdType, cmdText, cmdParms);
 | 
					        public Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3, T4>(null, transaction, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        async public Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
					        async public Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (string.IsNullOrEmpty(cmdText)) return NaviteTuple.Create(new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>());
 | 
					            if (string.IsNullOrEmpty(cmdText)) return NativeTuple.Create(new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>());
 | 
				
			||||||
            var ret1 = new List<T1>();
 | 
					            var ret1 = new List<T1>();
 | 
				
			||||||
            var type1 = typeof(T1);
 | 
					            var type1 = typeof(T1);
 | 
				
			||||||
            string flag1 = null;
 | 
					            string flag1 = null;
 | 
				
			||||||
@@ -306,17 +306,17 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                return Task.FromResult(false);
 | 
					                return Task.FromResult(false);
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return NaviteTuple.Create(ret1, ret2, ret3, ret4);
 | 
					            return NativeTuple.Create(ret1, ret2, ret3, ret4);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4, T5>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4, T5>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4, T5>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4, T5>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4, T5>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4, T5>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3, T4, T5>(null, null, cmdType, cmdText, cmdParms);
 | 
					        public Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3, T4, T5>(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        public Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3, T4, T5>(null, transaction, cmdType, cmdText, cmdParms);
 | 
					        public Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3, T4, T5>(null, transaction, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        async public Task<NaviteTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
					        async public Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (string.IsNullOrEmpty(cmdText)) return NaviteTuple.Create(new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>(), new List<T5>());
 | 
					            if (string.IsNullOrEmpty(cmdText)) return NativeTuple.Create(new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>(), new List<T5>());
 | 
				
			||||||
            var ret1 = new List<T1>();
 | 
					            var ret1 = new List<T1>();
 | 
				
			||||||
            var type1 = typeof(T1);
 | 
					            var type1 = typeof(T1);
 | 
				
			||||||
            string flag1 = null;
 | 
					            string flag1 = null;
 | 
				
			||||||
@@ -438,7 +438,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                return Task.FromResult(false);
 | 
					                return Task.FromResult(false);
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return NaviteTuple.Create(ret1, ret2, ret3, ret4, ret5);
 | 
					            return NativeTuple.Create(ret1, ret2, ret3, ret4, ret5);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        #endregion
 | 
					        #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -191,12 +191,12 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <param name="source"></param>
 | 
					        /// <param name="source"></param>
 | 
				
			||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
        public NaviteTuple<List<T1>, List<T1>> SplitSourceByIdentityValueIsNull(List<T1> source)
 | 
					        public NativeTuple<List<T1>, List<T1>> SplitSourceByIdentityValueIsNull(List<T1> source)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (_SplitSourceByIdentityValueIsNullFlag == 1) return NaviteTuple.Create(source, new List<T1>());
 | 
					            if (_SplitSourceByIdentityValueIsNullFlag == 1) return NativeTuple.Create(source, new List<T1>());
 | 
				
			||||||
            if (_SplitSourceByIdentityValueIsNullFlag == 2) return NaviteTuple.Create(new List<T1>(), source);
 | 
					            if (_SplitSourceByIdentityValueIsNullFlag == 2) return NativeTuple.Create(new List<T1>(), source);
 | 
				
			||||||
            if (IdentityColumn == null) return NaviteTuple.Create(source, new List<T1>());
 | 
					            if (IdentityColumn == null) return NativeTuple.Create(source, new List<T1>());
 | 
				
			||||||
            var ret = NaviteTuple.Create(new List<T1>(), new List<T1>());
 | 
					            var ret = NativeTuple.Create(new List<T1>(), new List<T1>());
 | 
				
			||||||
            foreach (var item in source)
 | 
					            foreach (var item in source)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (object.Equals(_orm.GetEntityValueWithPropertyName(_table.Type, item, IdentityColumn.CsName), IdentityColumn.CsType.CreateInstanceGetDefaultValue()))
 | 
					                if (object.Equals(_orm.GetEntityValueWithPropertyName(_table.Type, item, IdentityColumn.CsName), IdentityColumn.CsType.CreateInstanceGetDefaultValue()))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -571,13 +571,13 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            var dt = new DataTable();
 | 
					            var dt = new DataTable();
 | 
				
			||||||
            dt.TableName = TableRuleInvoke();
 | 
					            dt.TableName = TableRuleInvoke();
 | 
				
			||||||
            var dtCols = new List<NaviteTuple<ColumnInfo, Type, bool>>();
 | 
					            var dtCols = new List<NativeTuple<ColumnInfo, Type, bool>>();
 | 
				
			||||||
            foreach (var col in _table.ColumnsByPosition)
 | 
					            foreach (var col in _table.ColumnsByPosition)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (col.Attribute.IsIdentity && _insertIdentity == false) continue;
 | 
					                if (col.Attribute.IsIdentity && _insertIdentity == false) continue;
 | 
				
			||||||
                if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name)) continue;
 | 
					                if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name)) continue;
 | 
				
			||||||
                dt.Columns.Add(col.Attribute.Name, col.Attribute.MapType.NullableTypeOrThis());
 | 
					                dt.Columns.Add(col.Attribute.Name, col.Attribute.MapType.NullableTypeOrThis());
 | 
				
			||||||
                dtCols.Add(NaviteTuple.Create(col, col.Attribute.MapType.NullableTypeOrThis(), col.Attribute.MapType.IsNullableType()));
 | 
					                dtCols.Add(NativeTuple.Create(col, col.Attribute.MapType.NullableTypeOrThis(), col.Attribute.MapType.IsNullableType()));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (dt.Columns.Count == 0) return dt;
 | 
					            if (dt.Columns.Count == 0) return dt;
 | 
				
			||||||
            var didx = 0;
 | 
					            var didx = 0;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,11 +43,11 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            return this.InternalAvg(column?.Body);
 | 
					            return this.InternalAvg(column?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TKey>> exp)
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TKey>> exp)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (exp == null) return this.InternalGroupBy<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>>(exp?.Body);
 | 
					            if (exp == null) return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>>(exp?.Body);
 | 
				
			||||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
					            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
				
			||||||
            return this.InternalGroupBy<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>>(exp?.Body);
 | 
					            return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>>(exp?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TMember>> column)
 | 
					        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TMember>> column)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -292,7 +292,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            return this;
 | 
					            return this;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        static NaviteTuple<ParameterExpression, List<MemberExpression>> GetExpressionStack(Expression exp)
 | 
					        static NativeTuple<ParameterExpression, List<MemberExpression>> GetExpressionStack(Expression exp)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Expression tmpExp = exp;
 | 
					            Expression tmpExp = exp;
 | 
				
			||||||
            ParameterExpression param = null;
 | 
					            ParameterExpression param = null;
 | 
				
			||||||
@@ -316,7 +316,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (param == null) throw new Exception($"表达式错误,它的顶级对象不是 ParameterExpression:{exp}");
 | 
					            if (param == null) throw new Exception($"表达式错误,它的顶级对象不是 ParameterExpression:{exp}");
 | 
				
			||||||
            return NaviteTuple.Create(param, members.ToList());
 | 
					            return NativeTuple.Create(param, members.ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        static MethodInfo GetEntityValueWithPropertyNameMethod = typeof(EntityUtilExtensions).GetMethod("GetEntityValueWithPropertyName");
 | 
					        static MethodInfo GetEntityValueWithPropertyNameMethod = typeof(EntityUtilExtensions).GetMethod("GetEntityValueWithPropertyName");
 | 
				
			||||||
        static ConcurrentDictionary<Type, ConcurrentDictionary<string, MethodInfo>> _dicTypeMethod = new ConcurrentDictionary<Type, ConcurrentDictionary<string, MethodInfo>>();
 | 
					        static ConcurrentDictionary<Type, ConcurrentDictionary<string, MethodInfo>> _dicTypeMethod = new ConcurrentDictionary<Type, ConcurrentDictionary<string, MethodInfo>>();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,11 +27,11 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            return this.InternalAvg(column?.Body);
 | 
					            return this.InternalAvg(column?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2>> ISelect<T1, T2>.GroupBy<TKey>(Expression<Func<T1, T2, TKey>> exp)
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2>> ISelect<T1, T2>.GroupBy<TKey>(Expression<Func<T1, T2, TKey>> exp)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (exp == null) return this.InternalGroupBy<TKey, NaviteTuple<T1, T2>>(exp?.Body);
 | 
					            if (exp == null) return this.InternalGroupBy<TKey, NativeTuple<T1, T2>>(exp?.Body);
 | 
				
			||||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
					            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
				
			||||||
            return this.InternalGroupBy<TKey, NaviteTuple<T1, T2>>(exp?.Body);
 | 
					            return this.InternalGroupBy<TKey, NativeTuple<T1, T2>>(exp?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        TMember ISelect<T1, T2>.Max<TMember>(Expression<Func<T1, T2, TMember>> column)
 | 
					        TMember ISelect<T1, T2>.Max<TMember>(Expression<Func<T1, T2, TMember>> column)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,11 +29,11 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            return this.InternalAvg(column?.Body);
 | 
					            return this.InternalAvg(column?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2, T3>> ISelect<T1, T2, T3>.GroupBy<TKey>(Expression<Func<T1, T2, T3, TKey>> exp)
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2, T3>> ISelect<T1, T2, T3>.GroupBy<TKey>(Expression<Func<T1, T2, T3, TKey>> exp)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (exp == null) return this.InternalGroupBy<TKey, NaviteTuple<T1, T2, T3>>(exp?.Body);
 | 
					            if (exp == null) return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3>>(exp?.Body);
 | 
				
			||||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
					            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
				
			||||||
            return this.InternalGroupBy<TKey, NaviteTuple<T1, T2, T3>>(exp?.Body);
 | 
					            return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3>>(exp?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        TMember ISelect<T1, T2, T3>.Max<TMember>(Expression<Func<T1, T2, T3, TMember>> column)
 | 
					        TMember ISelect<T1, T2, T3>.Max<TMember>(Expression<Func<T1, T2, T3, TMember>> column)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,11 +31,11 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            return this.InternalAvg(column?.Body);
 | 
					            return this.InternalAvg(column?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2, T3, T4>> ISelect<T1, T2, T3, T4>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, TKey>> exp)
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4>> ISelect<T1, T2, T3, T4>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, TKey>> exp)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (exp == null) return this.InternalGroupBy<TKey, NaviteTuple<T1, T2, T3, T4>>(exp?.Body);
 | 
					            if (exp == null) return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4>>(exp?.Body);
 | 
				
			||||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
					            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
				
			||||||
            return this.InternalGroupBy<TKey, NaviteTuple<T1, T2, T3, T4>>(exp?.Body);
 | 
					            return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4>>(exp?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        TMember ISelect<T1, T2, T3, T4>.Max<TMember>(Expression<Func<T1, T2, T3, T4, TMember>> column)
 | 
					        TMember ISelect<T1, T2, T3, T4>.Max<TMember>(Expression<Func<T1, T2, T3, T4, TMember>> column)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,11 +33,11 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            return this.InternalAvg(column?.Body);
 | 
					            return this.InternalAvg(column?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2, T3, T4, T5>> ISelect<T1, T2, T3, T4, T5>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, TKey>> exp)
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5>> ISelect<T1, T2, T3, T4, T5>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, TKey>> exp)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (exp == null) return this.InternalGroupBy<TKey, NaviteTuple<T1, T2, T3, T4, T5>>(exp?.Body);
 | 
					            if (exp == null) return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5>>(exp?.Body);
 | 
				
			||||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
					            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
				
			||||||
            return this.InternalGroupBy<TKey, NaviteTuple<T1, T2, T3, T4, T5>>(exp?.Body);
 | 
					            return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5>>(exp?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        TMember ISelect<T1, T2, T3, T4, T5>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, TMember>> column)
 | 
					        TMember ISelect<T1, T2, T3, T4, T5>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, TMember>> column)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,11 +35,11 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            return this.InternalAvg(column?.Body);
 | 
					            return this.InternalAvg(column?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6>> ISelect<T1, T2, T3, T4, T5, T6>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, TKey>> exp)
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5, T6>> ISelect<T1, T2, T3, T4, T5, T6>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, TKey>> exp)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (exp == null) return this.InternalGroupBy<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6>>(exp?.Body);
 | 
					            if (exp == null) return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6>>(exp?.Body);
 | 
				
			||||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
					            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
				
			||||||
            return this.InternalGroupBy<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6>>(exp?.Body);
 | 
					            return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6>>(exp?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        TMember ISelect<T1, T2, T3, T4, T5, T6>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, TMember>> column)
 | 
					        TMember ISelect<T1, T2, T3, T4, T5, T6>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, TMember>> column)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,11 +37,11 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            return this.InternalAvg(column?.Body);
 | 
					            return this.InternalAvg(column?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6, T7>> ISelect<T1, T2, T3, T4, T5, T6, T7>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TKey>> exp)
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7>> ISelect<T1, T2, T3, T4, T5, T6, T7>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TKey>> exp)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (exp == null) return this.InternalGroupBy<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6, T7>>(exp?.Body);
 | 
					            if (exp == null) return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7>>(exp?.Body);
 | 
				
			||||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
					            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
				
			||||||
            return this.InternalGroupBy<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6, T7>>(exp?.Body);
 | 
					            return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7>>(exp?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        TMember ISelect<T1, T2, T3, T4, T5, T6, T7>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TMember>> column)
 | 
					        TMember ISelect<T1, T2, T3, T4, T5, T6, T7>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TMember>> column)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,11 +39,11 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            return this.InternalAvg(column?.Body);
 | 
					            return this.InternalAvg(column?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TKey>> exp)
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TKey>> exp)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (exp == null) return this.InternalGroupBy<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8>>(exp?.Body);
 | 
					            if (exp == null) return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8>>(exp?.Body);
 | 
				
			||||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
					            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
				
			||||||
            return this.InternalGroupBy<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8>>(exp?.Body);
 | 
					            return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8>>(exp?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TMember>> column)
 | 
					        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TMember>> column)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,11 +41,11 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            return this.InternalAvg(column?.Body);
 | 
					            return this.InternalAvg(column?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ISelectGrouping<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TKey>> exp)
 | 
					        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TKey>> exp)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (exp == null) return this.InternalGroupBy<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>>(exp?.Body);
 | 
					            if (exp == null) return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>>(exp?.Body);
 | 
				
			||||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
					            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
				
			||||||
            return this.InternalGroupBy<TKey, NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>>(exp?.Body);
 | 
					            return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>>(exp?.Body);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TMember>> column)
 | 
					        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TMember>> column)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,48 +4,48 @@ using System.Text;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace FreeSql.Internal.Model
 | 
					namespace FreeSql.Internal.Model
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    public static class NaviteTuple
 | 
					    public static class NativeTuple
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public static NaviteTuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) => new NaviteTuple<T1, T2>(item1, item2);
 | 
					        public static NativeTuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) => new NativeTuple<T1, T2>(item1, item2);
 | 
				
			||||||
        public static NaviteTuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3) => new NaviteTuple<T1, T2, T3>(item1, item2, item3);
 | 
					        public static NativeTuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3) => new NativeTuple<T1, T2, T3>(item1, item2, item3);
 | 
				
			||||||
        public static NaviteTuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 item1, T2 item2, T3 item3, T4 item4) => new NaviteTuple<T1, T2, T3, T4>(item1, item2, item3, item4);
 | 
					        public static NativeTuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 item1, T2 item2, T3 item3, T4 item4) => new NativeTuple<T1, T2, T3, T4>(item1, item2, item3, item4);
 | 
				
			||||||
        public static NaviteTuple<T1, T2, T3, T4, T5> Create<T1, T2, T3, T4, T5>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5) => new NaviteTuple<T1, T2, T3, T4, T5>(item1, item2, item3, item4, item5);
 | 
					        public static NativeTuple<T1, T2, T3, T4, T5> Create<T1, T2, T3, T4, T5>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5) => new NativeTuple<T1, T2, T3, T4, T5>(item1, item2, item3, item4, item5);
 | 
				
			||||||
        public static NaviteTuple<T1, T2, T3, T4, T5, T6> Create<T1, T2, T3, T4, T5, T6>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6) => new NaviteTuple<T1, T2, T3, T4, T5, T6>(item1, item2, item3, item4, item5, item6);
 | 
					        public static NativeTuple<T1, T2, T3, T4, T5, T6> Create<T1, T2, T3, T4, T5, T6>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6) => new NativeTuple<T1, T2, T3, T4, T5, T6>(item1, item2, item3, item4, item5, item6);
 | 
				
			||||||
        public static NaviteTuple<T1, T2, T3, T4, T5, T6, T7> Create<T1, T2, T3, T4, T5, T6, T7>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7) => new NaviteTuple<T1, T2, T3, T4, T5, T6, T7>(item1, item2, item3, item4, item5, item6, item7);
 | 
					        public static NativeTuple<T1, T2, T3, T4, T5, T6, T7> Create<T1, T2, T3, T4, T5, T6, T7>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7) => new NativeTuple<T1, T2, T3, T4, T5, T6, T7>(item1, item2, item3, item4, item5, item6, item7);
 | 
				
			||||||
        public static NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8> Create<T1, T2, T3, T4, T5, T6, T7, T8>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8) => new NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8>(item1, item2, item3, item4, item5, item6, item7, item8);
 | 
					        public static NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8> Create<T1, T2, T3, T4, T5, T6, T7, T8>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8) => new NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8>(item1, item2, item3, item4, item5, item6, item7, item8);
 | 
				
			||||||
        public static NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> Create<T1, T2, T3, T4, T5, T6, T7, T8, T9>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9) => new NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>(item1, item2, item3, item4, item5, item6, item7, item8, item9);
 | 
					        public static NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> Create<T1, T2, T3, T4, T5, T6, T7, T8, T9>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9) => new NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>(item1, item2, item3, item4, item5, item6, item7, item8, item9);
 | 
				
			||||||
        public static NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Create<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9, T10 item10) => new NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(item1, item2, item3, item4, item5, item6, item7, item8, item9, item10);
 | 
					        public static NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Create<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9, T10 item10) => new NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(item1, item2, item3, item4, item5, item6, item7, item8, item9, item10);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public class NaviteTuple<T1, T2>
 | 
					    public class NativeTuple<T1, T2>
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public T1 Item1 { get; }
 | 
					        public T1 Item1 { get; }
 | 
				
			||||||
        public T2 Item2 { get; }
 | 
					        public T2 Item2 { get; }
 | 
				
			||||||
        public NaviteTuple(T1 item1, T2 item2)
 | 
					        public NativeTuple(T1 item1, T2 item2)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Item1 = item1;
 | 
					            Item1 = item1;
 | 
				
			||||||
            Item2 = item2;
 | 
					            Item2 = item2;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    public class NaviteTuple<T1, T2, T3>
 | 
					    public class NativeTuple<T1, T2, T3>
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public T1 Item1 { get; }
 | 
					        public T1 Item1 { get; }
 | 
				
			||||||
        public T2 Item2 { get; }
 | 
					        public T2 Item2 { get; }
 | 
				
			||||||
        public T3 Item3 { get; }
 | 
					        public T3 Item3 { get; }
 | 
				
			||||||
        public NaviteTuple(T1 item1, T2 item2, T3 item3)
 | 
					        public NativeTuple(T1 item1, T2 item2, T3 item3)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Item1 = item1;
 | 
					            Item1 = item1;
 | 
				
			||||||
            Item2 = item2;
 | 
					            Item2 = item2;
 | 
				
			||||||
            Item3 = item3;
 | 
					            Item3 = item3;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    public class NaviteTuple<T1, T2, T3, T4>
 | 
					    public class NativeTuple<T1, T2, T3, T4>
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public T1 Item1 { get; }
 | 
					        public T1 Item1 { get; }
 | 
				
			||||||
        public T2 Item2 { get; }
 | 
					        public T2 Item2 { get; }
 | 
				
			||||||
        public T3 Item3 { get; }
 | 
					        public T3 Item3 { get; }
 | 
				
			||||||
        public T4 Item4 { get; }
 | 
					        public T4 Item4 { get; }
 | 
				
			||||||
        public NaviteTuple(T1 item1, T2 item2, T3 item3, T4 item4)
 | 
					        public NativeTuple(T1 item1, T2 item2, T3 item3, T4 item4)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Item1 = item1;
 | 
					            Item1 = item1;
 | 
				
			||||||
            Item2 = item2;
 | 
					            Item2 = item2;
 | 
				
			||||||
@@ -53,14 +53,14 @@ namespace FreeSql.Internal.Model
 | 
				
			|||||||
            Item4 = item4;
 | 
					            Item4 = item4;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    public class NaviteTuple<T1, T2, T3, T4, T5>
 | 
					    public class NativeTuple<T1, T2, T3, T4, T5>
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public T1 Item1 { get; }
 | 
					        public T1 Item1 { get; }
 | 
				
			||||||
        public T2 Item2 { get; }
 | 
					        public T2 Item2 { get; }
 | 
				
			||||||
        public T3 Item3 { get; }
 | 
					        public T3 Item3 { get; }
 | 
				
			||||||
        public T4 Item4 { get; }
 | 
					        public T4 Item4 { get; }
 | 
				
			||||||
        public T5 Item5 { get; }
 | 
					        public T5 Item5 { get; }
 | 
				
			||||||
        public NaviteTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
 | 
					        public NativeTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Item1 = item1;
 | 
					            Item1 = item1;
 | 
				
			||||||
            Item2 = item2;
 | 
					            Item2 = item2;
 | 
				
			||||||
@@ -69,7 +69,7 @@ namespace FreeSql.Internal.Model
 | 
				
			|||||||
            Item5 = item5;
 | 
					            Item5 = item5;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    public class NaviteTuple<T1, T2, T3, T4, T5, T6>
 | 
					    public class NativeTuple<T1, T2, T3, T4, T5, T6>
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public T1 Item1 { get; }
 | 
					        public T1 Item1 { get; }
 | 
				
			||||||
        public T2 Item2 { get; }
 | 
					        public T2 Item2 { get; }
 | 
				
			||||||
@@ -77,7 +77,7 @@ namespace FreeSql.Internal.Model
 | 
				
			|||||||
        public T4 Item4 { get; }
 | 
					        public T4 Item4 { get; }
 | 
				
			||||||
        public T5 Item5 { get; }
 | 
					        public T5 Item5 { get; }
 | 
				
			||||||
        public T6 Item6 { get; }
 | 
					        public T6 Item6 { get; }
 | 
				
			||||||
        public NaviteTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)
 | 
					        public NativeTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Item1 = item1;
 | 
					            Item1 = item1;
 | 
				
			||||||
            Item2 = item2;
 | 
					            Item2 = item2;
 | 
				
			||||||
@@ -87,7 +87,7 @@ namespace FreeSql.Internal.Model
 | 
				
			|||||||
            Item6 = item6;
 | 
					            Item6 = item6;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    public class NaviteTuple<T1, T2, T3, T4, T5, T6, T7>
 | 
					    public class NativeTuple<T1, T2, T3, T4, T5, T6, T7>
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public T1 Item1 { get; }
 | 
					        public T1 Item1 { get; }
 | 
				
			||||||
        public T2 Item2 { get; }
 | 
					        public T2 Item2 { get; }
 | 
				
			||||||
@@ -96,7 +96,7 @@ namespace FreeSql.Internal.Model
 | 
				
			|||||||
        public T5 Item5 { get; }
 | 
					        public T5 Item5 { get; }
 | 
				
			||||||
        public T6 Item6 { get; }
 | 
					        public T6 Item6 { get; }
 | 
				
			||||||
        public T7 Item7 { get; }
 | 
					        public T7 Item7 { get; }
 | 
				
			||||||
        public NaviteTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)
 | 
					        public NativeTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Item1 = item1;
 | 
					            Item1 = item1;
 | 
				
			||||||
            Item2 = item2;
 | 
					            Item2 = item2;
 | 
				
			||||||
@@ -107,7 +107,7 @@ namespace FreeSql.Internal.Model
 | 
				
			|||||||
            Item7 = item7;
 | 
					            Item7 = item7;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    public class NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8>
 | 
					    public class NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8>
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public T1 Item1 { get; }
 | 
					        public T1 Item1 { get; }
 | 
				
			||||||
        public T2 Item2 { get; }
 | 
					        public T2 Item2 { get; }
 | 
				
			||||||
@@ -117,7 +117,7 @@ namespace FreeSql.Internal.Model
 | 
				
			|||||||
        public T6 Item6 { get; }
 | 
					        public T6 Item6 { get; }
 | 
				
			||||||
        public T7 Item7 { get; }
 | 
					        public T7 Item7 { get; }
 | 
				
			||||||
        public T8 Item8 { get; }
 | 
					        public T8 Item8 { get; }
 | 
				
			||||||
        public NaviteTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8)
 | 
					        public NativeTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Item1 = item1;
 | 
					            Item1 = item1;
 | 
				
			||||||
            Item2 = item2;
 | 
					            Item2 = item2;
 | 
				
			||||||
@@ -129,7 +129,7 @@ namespace FreeSql.Internal.Model
 | 
				
			|||||||
            Item8 = item8;
 | 
					            Item8 = item8;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    public class NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>
 | 
					    public class NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public T1 Item1 { get; }
 | 
					        public T1 Item1 { get; }
 | 
				
			||||||
        public T2 Item2 { get; }
 | 
					        public T2 Item2 { get; }
 | 
				
			||||||
@@ -140,7 +140,7 @@ namespace FreeSql.Internal.Model
 | 
				
			|||||||
        public T7 Item7 { get; }
 | 
					        public T7 Item7 { get; }
 | 
				
			||||||
        public T8 Item8 { get; }
 | 
					        public T8 Item8 { get; }
 | 
				
			||||||
        public T9 Item9 { get; }
 | 
					        public T9 Item9 { get; }
 | 
				
			||||||
        public NaviteTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9)
 | 
					        public NativeTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Item1 = item1;
 | 
					            Item1 = item1;
 | 
				
			||||||
            Item2 = item2;
 | 
					            Item2 = item2;
 | 
				
			||||||
@@ -153,7 +153,7 @@ namespace FreeSql.Internal.Model
 | 
				
			|||||||
            Item9 = item9;
 | 
					            Item9 = item9;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    public class NaviteTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>
 | 
					    public class NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public T1 Item1 { get; }
 | 
					        public T1 Item1 { get; }
 | 
				
			||||||
        public T2 Item2 { get; }
 | 
					        public T2 Item2 { get; }
 | 
				
			||||||
@@ -165,7 +165,7 @@ namespace FreeSql.Internal.Model
 | 
				
			|||||||
        public T8 Item8 { get; }
 | 
					        public T8 Item8 { get; }
 | 
				
			||||||
        public T9 Item9 { get; }
 | 
					        public T9 Item9 { get; }
 | 
				
			||||||
        public T10 Item10 { get; }
 | 
					        public T10 Item10 { get; }
 | 
				
			||||||
        public NaviteTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9, T10 item10)
 | 
					        public NativeTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9, T10 item10)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Item1 = item1;
 | 
					            Item1 = item1;
 | 
				
			||||||
            Item2 = item2;
 | 
					            Item2 = item2;
 | 
				
			||||||
@@ -66,7 +66,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                trytb.DbOldName = trytb.DbOldName?.ToUpper();
 | 
					                trytb.DbOldName = trytb.DbOldName?.ToUpper();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (tbattr != null) trytb.DisableSyncStructure = tbattr.DisableSyncStructure;
 | 
					            if (tbattr != null) trytb.DisableSyncStructure = tbattr.DisableSyncStructure;
 | 
				
			||||||
            var propsLazy = new List<NaviteTuple<PropertyInfo, bool, bool, MethodInfo, MethodInfo>>();
 | 
					            var propsLazy = new List<NativeTuple<PropertyInfo, bool, bool, MethodInfo, MethodInfo>>();
 | 
				
			||||||
            var propsNavObjs = new List<PropertyInfo>();
 | 
					            var propsNavObjs = new List<PropertyInfo>();
 | 
				
			||||||
            var propsComment = CommonUtils.GetProperyCommentBySummary(entity);
 | 
					            var propsComment = CommonUtils.GetProperyCommentBySummary(entity);
 | 
				
			||||||
            var propsCommentByDescAttr = CommonUtils.GetPropertyCommentByDescriptionAttribute(entity);
 | 
					            var propsCommentByDescAttr = CommonUtils.GetPropertyCommentByDescriptionAttribute(entity);
 | 
				
			||||||
@@ -95,7 +95,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                        var getIsVirtual = getMethod?.IsVirtual == true && getMethod?.IsFinal == false;// trytb.Type.GetMethod($"get_{p.Name}")?.IsVirtual;
 | 
					                        var getIsVirtual = getMethod?.IsVirtual == true && getMethod?.IsFinal == false;// trytb.Type.GetMethod($"get_{p.Name}")?.IsVirtual;
 | 
				
			||||||
                        var setIsVirtual = setMethod?.IsVirtual == true && setMethod?.IsFinal == false;
 | 
					                        var setIsVirtual = setMethod?.IsVirtual == true && setMethod?.IsFinal == false;
 | 
				
			||||||
                        if (getIsVirtual == true || setIsVirtual == true)
 | 
					                        if (getIsVirtual == true || setIsVirtual == true)
 | 
				
			||||||
                            propsLazy.Add(NaviteTuple.Create(p, getIsVirtual, setIsVirtual, getMethod, setMethod));
 | 
					                            propsLazy.Add(NativeTuple.Create(p, getIsVirtual, setIsVirtual, getMethod, setMethod));
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    propsNavObjs.Add(p);
 | 
					                    propsNavObjs.Add(p);
 | 
				
			||||||
                    continue;
 | 
					                    continue;
 | 
				
			||||||
@@ -534,7 +534,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            return tbc.TryGetValue(entity, out var trytb2) ? trytb2 : trytb;
 | 
					            return tbc.TryGetValue(entity, out var trytb2) ? trytb2 : trytb;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public static void AddTableRef(CommonUtils common, TableInfo trytb, PropertyInfo pnv, bool isLazy, NaviteTuple<PropertyInfo, bool, bool, MethodInfo, MethodInfo> vp, StringBuilder cscode)
 | 
					        public static void AddTableRef(CommonUtils common, TableInfo trytb, PropertyInfo pnv, bool isLazy, NativeTuple<PropertyInfo, bool, bool, MethodInfo, MethodInfo> vp, StringBuilder cscode)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var getMethod = vp?.Item4;
 | 
					            var getMethod = vp?.Item4;
 | 
				
			||||||
            var setMethod = vp?.Item5;
 | 
					            var setMethod = vp?.Item5;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -83,7 +83,7 @@ namespace FreeSql.Dameng
 | 
				
			|||||||
                {
 | 
					                {
 | 
				
			||||||
                    userId = DamengConnectionPool.GetUserId(conn.Value.ConnectionString);
 | 
					                    userId = DamengConnectionPool.GetUserId(conn.Value.ConnectionString);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            var seqcols = new List<NaviteTuple<ColumnInfo, string[], bool>>(); //序列:列,表,自增
 | 
					            var seqcols = new List<NativeTuple<ColumnInfo, string[], bool>>(); //序列:列,表,自增
 | 
				
			||||||
            var seqnameDel = new List<string>(); //要删除的序列+触发器
 | 
					            var seqnameDel = new List<string>(); //要删除的序列+触发器
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var sb = new StringBuilder();
 | 
					            var sb = new StringBuilder();
 | 
				
			||||||
@@ -134,7 +134,7 @@ namespace FreeSql.Dameng
 | 
				
			|||||||
                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
					                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
					                            sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
				
			||||||
                            if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, true));
 | 
					                            if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, true));
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        if (tb.Primarys.Any())
 | 
					                        if (tb.Primarys.Any())
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
@@ -245,10 +245,10 @@ where a.owner={{0}} and a.table_name={{1}}", tboldname ?? tbname);
 | 
				
			|||||||
                                //修改列名
 | 
					                                //修改列名
 | 
				
			||||||
                                sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" RENAME COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" TO ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append("';\r\n");
 | 
					                                sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" RENAME COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" TO ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append("';\r\n");
 | 
				
			||||||
                                if (tbcol.Attribute.IsIdentity)
 | 
					                                if (tbcol.Attribute.IsIdentity)
 | 
				
			||||||
                                    seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                                    seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            else if (tbcol.Attribute.IsIdentity != tbstructcol.is_identity)
 | 
					                            else if (tbcol.Attribute.IsIdentity != tbstructcol.is_identity)
 | 
				
			||||||
                                seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                                seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                            if (isCommentChanged)
 | 
					                            if (isCommentChanged)
 | 
				
			||||||
                                sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
					                                sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
                            continue;
 | 
					                            continue;
 | 
				
			||||||
@@ -260,7 +260,7 @@ where a.owner={{0}} and a.table_name={{1}}", tboldname ?? tbname);
 | 
				
			|||||||
                            sbalter.Append("execute immediate 'UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" = ").Append(tbcol.DbDefaultValue.Replace("'", "''")).Append("';\r\n");
 | 
					                            sbalter.Append("execute immediate 'UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" = ").Append(tbcol.DbDefaultValue.Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
                            sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" MODIFY ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" NOT NULL';\r\n");
 | 
					                            sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" MODIFY ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" NOT NULL';\r\n");
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                        if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                        if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
					                        if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -323,7 +323,7 @@ and not exists(select 1 from all_constraints where index_name = a.index_name and
 | 
				
			|||||||
                foreach (var tbcol in tb.ColumnsByPosition)
 | 
					                foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
					                    sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
				
			||||||
                    if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, true));
 | 
					                    if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, true));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (tb.Primarys.Any())
 | 
					                if (tb.Primarys.Any())
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -84,7 +84,7 @@ namespace FreeSql.Odbc.Dameng
 | 
				
			|||||||
                {
 | 
					                {
 | 
				
			||||||
                    userId = OdbcDamengConnectionPool.GetUserId(conn.Value.ConnectionString);
 | 
					                    userId = OdbcDamengConnectionPool.GetUserId(conn.Value.ConnectionString);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            var seqcols = new List<NaviteTuple<ColumnInfo, string[], bool>>(); //序列:列,表,自增
 | 
					            var seqcols = new List<NativeTuple<ColumnInfo, string[], bool>>(); //序列:列,表,自增
 | 
				
			||||||
            var seqnameDel = new List<string>(); //要删除的序列+触发器
 | 
					            var seqnameDel = new List<string>(); //要删除的序列+触发器
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var sb = new StringBuilder();
 | 
					            var sb = new StringBuilder();
 | 
				
			||||||
@@ -135,7 +135,7 @@ namespace FreeSql.Odbc.Dameng
 | 
				
			|||||||
                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
					                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
					                            sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
				
			||||||
                            if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, true));
 | 
					                            if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, true));
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        if (tb.Primarys.Any())
 | 
					                        if (tb.Primarys.Any())
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
@@ -246,10 +246,10 @@ where a.owner={{0}} and a.table_name={{1}}", tboldname ?? tbname);
 | 
				
			|||||||
                                //修改列名
 | 
					                                //修改列名
 | 
				
			||||||
                                sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" RENAME COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" TO ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append("';\r\n");
 | 
					                                sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" RENAME COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" TO ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append("';\r\n");
 | 
				
			||||||
                                if (tbcol.Attribute.IsIdentity)
 | 
					                                if (tbcol.Attribute.IsIdentity)
 | 
				
			||||||
                                    seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                                    seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            else if (tbcol.Attribute.IsIdentity != tbstructcol.is_identity)
 | 
					                            else if (tbcol.Attribute.IsIdentity != tbstructcol.is_identity)
 | 
				
			||||||
                                seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                                seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                            if (isCommentChanged)
 | 
					                            if (isCommentChanged)
 | 
				
			||||||
                                sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
					                                sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
                            continue;
 | 
					                            continue;
 | 
				
			||||||
@@ -261,7 +261,7 @@ where a.owner={{0}} and a.table_name={{1}}", tboldname ?? tbname);
 | 
				
			|||||||
                            sbalter.Append("execute immediate 'UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" = ").Append(tbcol.DbDefaultValue.Replace("'", "''")).Append("';\r\n");
 | 
					                            sbalter.Append("execute immediate 'UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" = ").Append(tbcol.DbDefaultValue.Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
                            sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" MODIFY ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" NOT NULL';\r\n");
 | 
					                            sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" MODIFY ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" NOT NULL';\r\n");
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                        if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                        if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
					                        if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -324,7 +324,7 @@ and not exists(select 1 from all_constraints where index_name = a.index_name and
 | 
				
			|||||||
                foreach (var tbcol in tb.ColumnsByPosition)
 | 
					                foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
					                    sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
				
			||||||
                    if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, true));
 | 
					                    if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, true));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (tb.Primarys.Any())
 | 
					                if (tb.Primarys.Any())
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -77,7 +77,7 @@ namespace FreeSql.Odbc.KingbaseES
 | 
				
			|||||||
        protected override string GetComparisonDDLStatements(params TypeAndName[] objects)
 | 
					        protected override string GetComparisonDDLStatements(params TypeAndName[] objects)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var sb = new StringBuilder();
 | 
					            var sb = new StringBuilder();
 | 
				
			||||||
            var seqcols = new List<NaviteTuple<ColumnInfo, string[], bool>>(); //序列
 | 
					            var seqcols = new List<NativeTuple<ColumnInfo, string[], bool>>(); //序列
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            foreach (var obj in objects)
 | 
					            foreach (var obj in objects)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -123,7 +123,7 @@ namespace FreeSql.Odbc.KingbaseES
 | 
				
			|||||||
                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
					                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
					                            sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
				
			||||||
                            if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, true));
 | 
					                            if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, true));
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        if (tb.Primarys.Any())
 | 
					                        if (tb.Primarys.Any())
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
@@ -242,7 +242,7 @@ where ns.nspname = {0} and c.relname = {1}", tboldname ?? tbname);
 | 
				
			|||||||
                                }
 | 
					                                }
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            if (tbcol.Attribute.IsIdentity != tbstructcol.is_identity)
 | 
					                            if (tbcol.Attribute.IsIdentity != tbstructcol.is_identity)
 | 
				
			||||||
                                seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                                seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                            if (string.Compare(tbstructcol.column, tbcol.Attribute.OldName, true) == 0)
 | 
					                            if (string.Compare(tbstructcol.column, tbcol.Attribute.OldName, true) == 0)
 | 
				
			||||||
                                //修改列名
 | 
					                                //修改列名
 | 
				
			||||||
                                sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" RENAME COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" TO ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(";\r\n");
 | 
					                                sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" RENAME COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" TO ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(";\r\n");
 | 
				
			||||||
@@ -254,7 +254,7 @@ where ns.nspname = {0} and c.relname = {1}", tboldname ?? tbname);
 | 
				
			|||||||
                        sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ADD COLUMN ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType.Split(' ').First()).Append(";\r\n");
 | 
					                        sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ADD COLUMN ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType.Split(' ').First()).Append(";\r\n");
 | 
				
			||||||
                        sbalter.Append("UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" = ").Append(tbcol.DbDefaultValue).Append(";\r\n");
 | 
					                        sbalter.Append("UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" = ").Append(tbcol.DbDefaultValue).Append(";\r\n");
 | 
				
			||||||
                        if (tbcol.Attribute.IsNullable == false) sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ALTER COLUMN ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" SET NOT NULL;\r\n");
 | 
					                        if (tbcol.Attribute.IsNullable == false) sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ALTER COLUMN ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" SET NOT NULL;\r\n");
 | 
				
			||||||
                        if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                        if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                        if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append("COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment)).Append(";\r\n");
 | 
					                        if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append("COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment)).Append(";\r\n");
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    var dsuksql = _commonUtils.FormatSql(@"
 | 
					                    var dsuksql = _commonUtils.FormatSql(@"
 | 
				
			||||||
@@ -322,7 +322,7 @@ where sys_namespace.nspname={0} and sys_class.relname={1} and sys_constraint.con
 | 
				
			|||||||
                foreach (var tbcol in tb.ColumnsByPosition)
 | 
					                foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
					                    sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
				
			||||||
                    if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, true));
 | 
					                    if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, true));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (tb.Primarys.Any())
 | 
					                if (tb.Primarys.Any())
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -84,7 +84,7 @@ namespace FreeSql.Odbc.Oracle
 | 
				
			|||||||
                {
 | 
					                {
 | 
				
			||||||
                    userId = OdbcOracleConnectionPool.GetUserId(conn.Value.ConnectionString);
 | 
					                    userId = OdbcOracleConnectionPool.GetUserId(conn.Value.ConnectionString);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            var seqcols = new List<NaviteTuple<ColumnInfo, string[], bool>>(); //序列:列,表,自增
 | 
					            var seqcols = new List<NativeTuple<ColumnInfo, string[], bool>>(); //序列:列,表,自增
 | 
				
			||||||
            var seqnameDel = new List<string>(); //要删除的序列+触发器
 | 
					            var seqnameDel = new List<string>(); //要删除的序列+触发器
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var sb = new StringBuilder();
 | 
					            var sb = new StringBuilder();
 | 
				
			||||||
@@ -135,7 +135,7 @@ namespace FreeSql.Odbc.Oracle
 | 
				
			|||||||
                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
					                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
					                            sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
				
			||||||
                            if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, true));
 | 
					                            if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, true));
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        if (tb.Primarys.Any())
 | 
					                        if (tb.Primarys.Any())
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
@@ -243,10 +243,10 @@ where a.owner={{0}} and a.table_name={{1}}", tboldname ?? tbname);
 | 
				
			|||||||
                                //修改列名
 | 
					                                //修改列名
 | 
				
			||||||
                                sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" RENAME COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" TO ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append("';\r\n");
 | 
					                                sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" RENAME COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" TO ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append("';\r\n");
 | 
				
			||||||
                                if (tbcol.Attribute.IsIdentity)
 | 
					                                if (tbcol.Attribute.IsIdentity)
 | 
				
			||||||
                                    seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                                    seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            else if (tbcol.Attribute.IsIdentity != tbstructcol.is_identity)
 | 
					                            else if (tbcol.Attribute.IsIdentity != tbstructcol.is_identity)
 | 
				
			||||||
                                seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                                seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                            if (isCommentChanged)
 | 
					                            if (isCommentChanged)
 | 
				
			||||||
                                sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
					                                sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
                            continue;
 | 
					                            continue;
 | 
				
			||||||
@@ -258,7 +258,7 @@ where a.owner={{0}} and a.table_name={{1}}", tboldname ?? tbname);
 | 
				
			|||||||
                            sbalter.Append("execute immediate 'UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" = ").Append(tbcol.DbDefaultValue.Replace("'", "''")).Append("';\r\n");
 | 
					                            sbalter.Append("execute immediate 'UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" = ").Append(tbcol.DbDefaultValue.Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
                            sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" MODIFY ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" NOT NULL';\r\n");
 | 
					                            sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" MODIFY ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" NOT NULL';\r\n");
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                        if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                        if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
					                        if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -321,7 +321,7 @@ and not exists(select 1 from all_constraints where constraint_name = a.index_nam
 | 
				
			|||||||
                foreach (var tbcol in tb.ColumnsByPosition)
 | 
					                foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
					                    sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
				
			||||||
                    if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, true));
 | 
					                    if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, true));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (tb.Primarys.Any())
 | 
					                if (tb.Primarys.Any())
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -83,7 +83,7 @@ namespace FreeSql.Odbc.PostgreSQL
 | 
				
			|||||||
        protected override string GetComparisonDDLStatements(params TypeAndName[] objects)
 | 
					        protected override string GetComparisonDDLStatements(params TypeAndName[] objects)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var sb = new StringBuilder();
 | 
					            var sb = new StringBuilder();
 | 
				
			||||||
            var seqcols = new List<NaviteTuple<ColumnInfo, string[], bool>>(); //序列
 | 
					            var seqcols = new List<NativeTuple<ColumnInfo, string[], bool>>(); //序列
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var is96 = true;
 | 
					            var is96 = true;
 | 
				
			||||||
            using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
 | 
					            using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
 | 
				
			||||||
@@ -135,7 +135,7 @@ namespace FreeSql.Odbc.PostgreSQL
 | 
				
			|||||||
                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
					                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
					                            sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
				
			||||||
                            if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, true));
 | 
					                            if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, true));
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        if (tb.Primarys.Any())
 | 
					                        if (tb.Primarys.Any())
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
@@ -254,7 +254,7 @@ where ns.nspname = {0} and c.relname = {1}", tboldname ?? tbname);
 | 
				
			|||||||
                                }
 | 
					                                }
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            if (tbcol.Attribute.IsIdentity != tbstructcol.is_identity)
 | 
					                            if (tbcol.Attribute.IsIdentity != tbstructcol.is_identity)
 | 
				
			||||||
                                seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                                seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                            if (string.Compare(tbstructcol.column, tbcol.Attribute.OldName, true) == 0)
 | 
					                            if (string.Compare(tbstructcol.column, tbcol.Attribute.OldName, true) == 0)
 | 
				
			||||||
                                //修改列名
 | 
					                                //修改列名
 | 
				
			||||||
                                sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" RENAME COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" TO ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(";\r\n");
 | 
					                                sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" RENAME COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" TO ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(";\r\n");
 | 
				
			||||||
@@ -266,7 +266,7 @@ where ns.nspname = {0} and c.relname = {1}", tboldname ?? tbname);
 | 
				
			|||||||
                        sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ADD COLUMN ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType.Split(' ').First()).Append(";\r\n");
 | 
					                        sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ADD COLUMN ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType.Split(' ').First()).Append(";\r\n");
 | 
				
			||||||
                        sbalter.Append("UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" = ").Append(tbcol.DbDefaultValue).Append(";\r\n");
 | 
					                        sbalter.Append("UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" = ").Append(tbcol.DbDefaultValue).Append(";\r\n");
 | 
				
			||||||
                        if (tbcol.Attribute.IsNullable == false) sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ALTER COLUMN ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" SET NOT NULL;\r\n");
 | 
					                        if (tbcol.Attribute.IsNullable == false) sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ALTER COLUMN ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" SET NOT NULL;\r\n");
 | 
				
			||||||
                        if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                        if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                        if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append("COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment)).Append(";\r\n");
 | 
					                        if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append("COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment)).Append(";\r\n");
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    var dsuksql = _commonUtils.FormatSql($@"
 | 
					                    var dsuksql = _commonUtils.FormatSql($@"
 | 
				
			||||||
@@ -334,7 +334,7 @@ where pg_namespace.nspname={0} and pg_class.relname={1} and pg_constraint.contyp
 | 
				
			|||||||
                foreach (var tbcol in tb.ColumnsByPosition)
 | 
					                foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
					                    sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
				
			||||||
                    if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, true));
 | 
					                    if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, true));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (tb.Primarys.Any())
 | 
					                if (tb.Primarys.Any())
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -85,7 +85,7 @@ namespace FreeSql.Oracle
 | 
				
			|||||||
                {
 | 
					                {
 | 
				
			||||||
                    userId = OracleConnectionPool.GetUserId(conn.Value.ConnectionString);
 | 
					                    userId = OracleConnectionPool.GetUserId(conn.Value.ConnectionString);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            var seqcols = new List<NaviteTuple<ColumnInfo, string[], bool>>(); //序列:列,表,自增
 | 
					            var seqcols = new List<NativeTuple<ColumnInfo, string[], bool>>(); //序列:列,表,自增
 | 
				
			||||||
            var seqnameDel = new List<string>(); //要删除的序列+触发器
 | 
					            var seqnameDel = new List<string>(); //要删除的序列+触发器
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var sb = new StringBuilder();
 | 
					            var sb = new StringBuilder();
 | 
				
			||||||
@@ -136,7 +136,7 @@ namespace FreeSql.Oracle
 | 
				
			|||||||
                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
					                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
					                            sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
				
			||||||
                            if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, true));
 | 
					                            if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, true));
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        if (tb.Primarys.Any())
 | 
					                        if (tb.Primarys.Any())
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
@@ -244,10 +244,10 @@ where a.owner={{0}} and a.table_name={{1}}", tboldname ?? tbname);
 | 
				
			|||||||
                                //修改列名
 | 
					                                //修改列名
 | 
				
			||||||
                                sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" RENAME COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" TO ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append("';\r\n");
 | 
					                                sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" RENAME COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" TO ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append("';\r\n");
 | 
				
			||||||
                                if (tbcol.Attribute.IsIdentity)
 | 
					                                if (tbcol.Attribute.IsIdentity)
 | 
				
			||||||
                                    seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                                    seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            else if (tbcol.Attribute.IsIdentity != tbstructcol.is_identity)
 | 
					                            else if (tbcol.Attribute.IsIdentity != tbstructcol.is_identity)
 | 
				
			||||||
                                seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                                seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                            if (isCommentChanged)
 | 
					                            if (isCommentChanged)
 | 
				
			||||||
                                sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
					                                sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
                            continue;
 | 
					                            continue;
 | 
				
			||||||
@@ -259,7 +259,7 @@ where a.owner={{0}} and a.table_name={{1}}", tboldname ?? tbname);
 | 
				
			|||||||
                            sbalter.Append("execute immediate 'UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" = ").Append(tbcol.DbDefaultValue.Replace("'", "''")).Append("';\r\n");
 | 
					                            sbalter.Append("execute immediate 'UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" = ").Append(tbcol.DbDefaultValue.Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
                            sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" MODIFY ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" NOT NULL';\r\n");
 | 
					                            sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" MODIFY ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" NOT NULL';\r\n");
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                        if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                        if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
					                        if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -322,7 +322,7 @@ and not exists(select 1 from all_constraints where constraint_name = a.index_nam
 | 
				
			|||||||
                foreach (var tbcol in tb.ColumnsByPosition)
 | 
					                foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
					                    sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
				
			||||||
                    if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, true));
 | 
					                    if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, true));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (tb.Primarys.Any())
 | 
					                if (tb.Primarys.Any())
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -89,7 +89,7 @@ namespace FreeSql.ShenTong
 | 
				
			|||||||
        protected override string GetComparisonDDLStatements(params TypeAndName[] objects)
 | 
					        protected override string GetComparisonDDLStatements(params TypeAndName[] objects)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var sb = new StringBuilder();
 | 
					            var sb = new StringBuilder();
 | 
				
			||||||
            var seqcols = new List<NaviteTuple<ColumnInfo, string[], bool>>(); //序列
 | 
					            var seqcols = new List<NativeTuple<ColumnInfo, string[], bool>>(); //序列
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            foreach (var obj in objects)
 | 
					            foreach (var obj in objects)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -135,7 +135,7 @@ namespace FreeSql.ShenTong
 | 
				
			|||||||
                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
					                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
					                            sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
				
			||||||
                            if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, true));
 | 
					                            if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, true));
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        if (tb.Primarys.Any())
 | 
					                        if (tb.Primarys.Any())
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
@@ -254,7 +254,7 @@ where ns.nspname = {0} and c.relname = {1}", tboldname ?? tbname);
 | 
				
			|||||||
                                }
 | 
					                                }
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            if (tbcol.Attribute.IsIdentity != tbstructcol.is_identity)
 | 
					                            if (tbcol.Attribute.IsIdentity != tbstructcol.is_identity)
 | 
				
			||||||
                                seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                                seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                            if (string.Compare(tbstructcol.column, tbcol.Attribute.OldName, true) == 0)
 | 
					                            if (string.Compare(tbstructcol.column, tbcol.Attribute.OldName, true) == 0)
 | 
				
			||||||
                                //修改列名
 | 
					                                //修改列名
 | 
				
			||||||
                                sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" RENAME COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" TO ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(";\r\n");
 | 
					                                sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" RENAME COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" TO ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(";\r\n");
 | 
				
			||||||
@@ -266,7 +266,7 @@ where ns.nspname = {0} and c.relname = {1}", tboldname ?? tbname);
 | 
				
			|||||||
                        sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ADD COLUMN ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType.Split(' ').First()).Append(";\r\n");
 | 
					                        sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ADD COLUMN ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType.Split(' ').First()).Append(";\r\n");
 | 
				
			||||||
                        sbalter.Append("UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" = ").Append(tbcol.DbDefaultValue).Append(";\r\n");
 | 
					                        sbalter.Append("UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" = ").Append(tbcol.DbDefaultValue).Append(";\r\n");
 | 
				
			||||||
                        if (tbcol.Attribute.IsNullable == false) sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ALTER COLUMN ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" SET NOT NULL;\r\n");
 | 
					                        if (tbcol.Attribute.IsNullable == false) sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ALTER COLUMN ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" SET NOT NULL;\r\n");
 | 
				
			||||||
                        if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
					                        if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
                        if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append("COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment)).Append(";\r\n");
 | 
					                        if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append("COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment)).Append(";\r\n");
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    var dsuksql = _commonUtils.FormatSql(@"
 | 
					                    var dsuksql = _commonUtils.FormatSql(@"
 | 
				
			||||||
@@ -335,7 +335,7 @@ where sys_namespace.nspname={0} and sys_class.relname={1} and sys_constraint.con
 | 
				
			|||||||
                foreach (var tbcol in tb.ColumnsByPosition)
 | 
					                foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
					                    sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
				
			||||||
                    if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, true));
 | 
					                    if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, true));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (tb.Primarys.Any())
 | 
					                if (tb.Primarys.Any())
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -42,11 +42,11 @@ public static partial class FreeSqlSqlServerGlobalExtensions
 | 
				
			|||||||
    /// <param name="options"></param>
 | 
					    /// <param name="options"></param>
 | 
				
			||||||
    public static IFreeSql SetGlobalSelectWithLock(this IFreeSql that, SqlServerLock lockType, Dictionary<Type, bool> rule)
 | 
					    public static IFreeSql SetGlobalSelectWithLock(this IFreeSql that, SqlServerLock lockType, Dictionary<Type, bool> rule)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        var value = NaviteTuple.Create(lockType, rule);
 | 
					        var value = NativeTuple.Create(lockType, rule);
 | 
				
			||||||
        _dicSetGlobalSelectWithLock.AddOrUpdate(that.Ado.Identifier, value, (_, __) => value);
 | 
					        _dicSetGlobalSelectWithLock.AddOrUpdate(that.Ado.Identifier, value, (_, __) => value);
 | 
				
			||||||
        return that;
 | 
					        return that;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    internal static ConcurrentDictionary<Guid, NaviteTuple<SqlServerLock, Dictionary<Type, bool>>> _dicSetGlobalSelectWithLock = new ConcurrentDictionary<Guid, NaviteTuple<SqlServerLock, Dictionary<Type, bool>>>();
 | 
					    internal static ConcurrentDictionary<Guid, NativeTuple<SqlServerLock, Dictionary<Type, bool>>> _dicSetGlobalSelectWithLock = new ConcurrentDictionary<Guid, NativeTuple<SqlServerLock, Dictionary<Type, bool>>>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #region ExecuteSqlBulkCopy
 | 
					    #region ExecuteSqlBulkCopy
 | 
				
			||||||
    /// <summary>
 | 
					    /// <summary>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user