mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 增加 ISelect<11..16> 16 个多联表查询;
This commit is contained in:
		@@ -0,0 +1,291 @@
 | 
			
		||||
using FreeSql.Internal.Model;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    public abstract class Select11Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> : Select0Provider<ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, T1>, ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>
 | 
			
		||||
            where T1 : class
 | 
			
		||||
            where T2 : class
 | 
			
		||||
            where T3 : class
 | 
			
		||||
            where T4 : class
 | 
			
		||||
            where T5 : class
 | 
			
		||||
            where T6 : class
 | 
			
		||||
            where T7 : class
 | 
			
		||||
            where T8 : class
 | 
			
		||||
            where T9 : class
 | 
			
		||||
            where T10 : class
 | 
			
		||||
            where T11 : class
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        public Select11Provider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere)
 | 
			
		||||
        {
 | 
			
		||||
            if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10), typeof(T11));
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T2)), Alias = $"SP10b", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T3)), Alias = $"SP10c", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T4)), Alias = $"SP10d", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T5)), Alias = $"SP10e", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T6)), Alias = $"SP10f", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T7)), Alias = $"SP10g", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T8)), Alias = $"SP10h", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T9)), Alias = $"SP10i", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T10)), Alias = $"SP10j", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T11)), Alias = $"SP10k", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.WithSql(string sqlT1, string sqlT2, string sqlT3, string sqlT4, string sqlT5, string sqlT6, string sqlT7, string sqlT8, string sqlT9, string sqlT10, string sqlT11, object parms)
 | 
			
		||||
        {
 | 
			
		||||
            this.AsTable((type, old) =>
 | 
			
		||||
            {
 | 
			
		||||
                if (type == _tables[0].Table?.Type) return $"( {sqlT1} )";
 | 
			
		||||
                if (type == _tables[1].Table?.Type) return $"( {sqlT2} )";
 | 
			
		||||
                if (type == _tables[2].Table?.Type) return $"( {sqlT3} )";
 | 
			
		||||
                if (type == _tables[3].Table?.Type) return $"( {sqlT4} )";
 | 
			
		||||
                if (type == _tables[4].Table?.Type) return $"( {sqlT5} )";
 | 
			
		||||
                if (type == _tables[5].Table?.Type) return $"( {sqlT6} )";
 | 
			
		||||
                if (type == _tables[6].Table?.Type) return $"( {sqlT7} )";
 | 
			
		||||
                if (type == _tables[7].Table?.Type) return $"( {sqlT8} )";
 | 
			
		||||
                if (type == _tables[8].Table?.Type) return $"( {sqlT9} )";
 | 
			
		||||
                if (type == _tables[9].Table?.Type) return $"( {sqlT10} )";
 | 
			
		||||
                if (type == _tables[10].Table?.Type) return $"( {sqlT11} )";
 | 
			
		||||
                return old;
 | 
			
		||||
            });
 | 
			
		||||
            if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject($"{sqlT1};\r\n{sqlT2};\r\n{sqlT3};\r\n{sqlT4};\r\n{sqlT5};\r\n{sqlT6};\r\n{sqlT7};\r\n{sqlT8};\r\n{sqlT9};\r\n{sqlT10};\r\n{sqlT11}", parms));
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        double ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.Avg<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return 0;
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalAvg(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TKey>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>>(exp?.Body);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>>(exp?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return default(TMember);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMax<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.Min<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return default(TMember);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMin<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalOrderBy(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalOrderByDescending(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.OrderByIf<TMember>(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TMember>> column, bool descending)
 | 
			
		||||
        {
 | 
			
		||||
            if (condition == false || column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return descending ? this.InternalOrderByDescending(column?.Body) : this.InternalOrderBy(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        decimal ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.Sum<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalSum(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.ToAggregate<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return default(TReturn);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToAggregate<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.Aggregate<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, TReturn>> select, out TReturn result)
 | 
			
		||||
        {
 | 
			
		||||
            result = (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>).ToAggregate(select);
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        List<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.ToList<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToList<TReturn>(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToList<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        List<TDto> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.ToList<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>).ToList(GetToListDtoSelector<TDto>());
 | 
			
		||||
        Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TDto>> GetToListDtoSelector<TDto>()
 | 
			
		||||
        {
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TDto>>(
 | 
			
		||||
                typeof(TDto).InternalNewExpression(),
 | 
			
		||||
                _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"),
 | 
			
		||||
                Expression.Parameter(typeof(T2), "b"),
 | 
			
		||||
                Expression.Parameter(typeof(T3), "c"),
 | 
			
		||||
                Expression.Parameter(typeof(T4), "d"),
 | 
			
		||||
                Expression.Parameter(typeof(T5), "e"),
 | 
			
		||||
                Expression.Parameter(typeof(T6), "f"),
 | 
			
		||||
                Expression.Parameter(typeof(T7), "g"),
 | 
			
		||||
                Expression.Parameter(typeof(T8), "h"),
 | 
			
		||||
                Expression.Parameter(typeof(T9), "i"),
 | 
			
		||||
                Expression.Parameter(typeof(T10), "j"),
 | 
			
		||||
                Expression.Parameter(typeof(T11), "k"));
 | 
			
		||||
        }
 | 
			
		||||
        public void ToChunk<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TReturn>> select, int size, Action<FetchCallbackArgs<List<TReturn>>> done)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null || done == null) return;
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            this.InternalToChunk<TReturn>(select.Body, size, done);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        DataTable ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToDataTable(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToDataTable(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        string ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TReturn>> select, FieldAliasOptions fieldAlias)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToSql<TReturn>(select?.Body, fieldAlias);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToSql<TReturn>(select?.Body, fieldAlias);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.LeftJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.InnerJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.InnerJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.RightJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.RightJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.Where(null);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (condition == false || exp == null) return this.Where(null);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)) : this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        bool ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.Any();
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            var oldwhere = _where.ToString();
 | 
			
		||||
            var ret = this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)).Any();
 | 
			
		||||
            _where.Clear().Append(oldwhere);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.ToOne<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TReturn>> select) => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>).Limit(1).ToList(select).FirstOrDefault();
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.First<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TReturn>> select) => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>).Limit(1).ToList(select).FirstOrDefault();
 | 
			
		||||
        TDto ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.First<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>).Limit(1).ToList<TDto>().FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
#if net40
 | 
			
		||||
#else
 | 
			
		||||
        Task<double> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.AvgAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(double));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalAvgAsync(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TMember> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.MaxAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(TMember));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMaxAsync<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TMember> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.MinAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(TMember));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMinAsync<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<decimal> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.SumAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalSumAsync(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.ToAggregateAsync<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return Task.FromResult(default(TReturn));
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToAggregateAsync<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<List<TReturn>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        Task<List<TDto>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.ToListAsync<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>).ToListAsync(GetToListDtoSelector<TDto>());
 | 
			
		||||
 | 
			
		||||
        Task<DataTable> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        async Task<bool> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return await this.AnyAsync();
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            var oldwhere = _where.ToString();
 | 
			
		||||
            var ret = await this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)).AnyAsync();
 | 
			
		||||
            _where.Clear().Append(oldwhere);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        async Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.ToOneAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TReturn>> select) => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>).Limit(1).ToListAsync(select)).FirstOrDefault();
 | 
			
		||||
        async Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.FirstAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TReturn>> select) => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>).Limit(1).ToListAsync(select)).FirstOrDefault();
 | 
			
		||||
        async Task<TDto> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>.FirstAsync<TDto>() => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>).Limit(1).ToListAsync<TDto>()).FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,295 @@
 | 
			
		||||
using FreeSql.Internal.Model;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    public abstract class Select12Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> : Select0Provider<ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, T1>, ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>
 | 
			
		||||
            where T1 : class
 | 
			
		||||
            where T2 : class
 | 
			
		||||
            where T3 : class
 | 
			
		||||
            where T4 : class
 | 
			
		||||
            where T5 : class
 | 
			
		||||
            where T6 : class
 | 
			
		||||
            where T7 : class
 | 
			
		||||
            where T8 : class
 | 
			
		||||
            where T9 : class
 | 
			
		||||
            where T10 : class
 | 
			
		||||
            where T11 : class
 | 
			
		||||
            where T12 : class
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        public Select12Provider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere)
 | 
			
		||||
        {
 | 
			
		||||
            if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10), typeof(T11), typeof(T12));
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T2)), Alias = $"SP10b", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T3)), Alias = $"SP10c", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T4)), Alias = $"SP10d", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T5)), Alias = $"SP10e", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T6)), Alias = $"SP10f", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T7)), Alias = $"SP10g", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T8)), Alias = $"SP10h", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T9)), Alias = $"SP10i", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T10)), Alias = $"SP10j", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T11)), Alias = $"SP10k", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T12)), Alias = $"SP10l", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.WithSql(string sqlT1, string sqlT2, string sqlT3, string sqlT4, string sqlT5, string sqlT6, string sqlT7, string sqlT8, string sqlT9, string sqlT10, string sqlT11, string sqlT12, object parms)
 | 
			
		||||
        {
 | 
			
		||||
            this.AsTable((type, old) =>
 | 
			
		||||
            {
 | 
			
		||||
                if (type == _tables[0].Table?.Type) return $"( {sqlT1} )";
 | 
			
		||||
                if (type == _tables[1].Table?.Type) return $"( {sqlT2} )";
 | 
			
		||||
                if (type == _tables[2].Table?.Type) return $"( {sqlT3} )";
 | 
			
		||||
                if (type == _tables[3].Table?.Type) return $"( {sqlT4} )";
 | 
			
		||||
                if (type == _tables[4].Table?.Type) return $"( {sqlT5} )";
 | 
			
		||||
                if (type == _tables[5].Table?.Type) return $"( {sqlT6} )";
 | 
			
		||||
                if (type == _tables[6].Table?.Type) return $"( {sqlT7} )";
 | 
			
		||||
                if (type == _tables[7].Table?.Type) return $"( {sqlT8} )";
 | 
			
		||||
                if (type == _tables[8].Table?.Type) return $"( {sqlT9} )";
 | 
			
		||||
                if (type == _tables[9].Table?.Type) return $"( {sqlT10} )";
 | 
			
		||||
                if (type == _tables[10].Table?.Type) return $"( {sqlT11} )";
 | 
			
		||||
                if (type == _tables[11].Table?.Type) return $"( {sqlT12} )";
 | 
			
		||||
                return old;
 | 
			
		||||
            });
 | 
			
		||||
            if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject($"{sqlT1};\r\n{sqlT2};\r\n{sqlT3};\r\n{sqlT4};\r\n{sqlT5};\r\n{sqlT6};\r\n{sqlT7};\r\n{sqlT8};\r\n{sqlT9};\r\n{sqlT10};\r\n{sqlT11};\r\n{sqlT12}", parms));
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        double ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.Avg<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return 0;
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalAvg(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TKey>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>>(exp?.Body);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>>(exp?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return default(TMember);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMax<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.Min<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return default(TMember);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMin<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalOrderBy(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalOrderByDescending(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.OrderByIf<TMember>(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TMember>> column, bool descending)
 | 
			
		||||
        {
 | 
			
		||||
            if (condition == false || column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return descending ? this.InternalOrderByDescending(column?.Body) : this.InternalOrderBy(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        decimal ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.Sum<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalSum(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.ToAggregate<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, ISelectGroupingAggregate<T12>, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return default(TReturn);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToAggregate<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.Aggregate<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, ISelectGroupingAggregate<T12>, TReturn>> select, out TReturn result)
 | 
			
		||||
        {
 | 
			
		||||
            result = (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>).ToAggregate(select);
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        List<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.ToList<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToList<TReturn>(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToList<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        List<TDto> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.ToList<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>).ToList(GetToListDtoSelector<TDto>());
 | 
			
		||||
        Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TDto>> GetToListDtoSelector<TDto>()
 | 
			
		||||
        {
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TDto>>(
 | 
			
		||||
                typeof(TDto).InternalNewExpression(),
 | 
			
		||||
                _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"),
 | 
			
		||||
                Expression.Parameter(typeof(T2), "b"),
 | 
			
		||||
                Expression.Parameter(typeof(T3), "c"),
 | 
			
		||||
                Expression.Parameter(typeof(T4), "d"),
 | 
			
		||||
                Expression.Parameter(typeof(T5), "e"),
 | 
			
		||||
                Expression.Parameter(typeof(T6), "f"),
 | 
			
		||||
                Expression.Parameter(typeof(T7), "g"),
 | 
			
		||||
                Expression.Parameter(typeof(T8), "h"),
 | 
			
		||||
                Expression.Parameter(typeof(T9), "i"),
 | 
			
		||||
                Expression.Parameter(typeof(T10), "j"),
 | 
			
		||||
                Expression.Parameter(typeof(T11), "k"),
 | 
			
		||||
                Expression.Parameter(typeof(T12), "l"));
 | 
			
		||||
        }
 | 
			
		||||
        public void ToChunk<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TReturn>> select, int size, Action<FetchCallbackArgs<List<TReturn>>> done)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null || done == null) return;
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            this.InternalToChunk<TReturn>(select.Body, size, done);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        DataTable ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToDataTable(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToDataTable(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        string ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TReturn>> select, FieldAliasOptions fieldAlias)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToSql<TReturn>(select?.Body, fieldAlias);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToSql<TReturn>(select?.Body, fieldAlias);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.LeftJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.InnerJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.InnerJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.RightJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.RightJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.Where(null);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (condition == false || exp == null) return this.Where(null);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)) : this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        bool ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.Any();
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            var oldwhere = _where.ToString();
 | 
			
		||||
            var ret = this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)).Any();
 | 
			
		||||
            _where.Clear().Append(oldwhere);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.ToOne<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TReturn>> select) => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>).Limit(1).ToList(select).FirstOrDefault();
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.First<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TReturn>> select) => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>).Limit(1).ToList(select).FirstOrDefault();
 | 
			
		||||
        TDto ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.First<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>).Limit(1).ToList<TDto>().FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
#if net40
 | 
			
		||||
#else
 | 
			
		||||
        Task<double> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.AvgAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(double));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalAvgAsync(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TMember> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.MaxAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(TMember));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMaxAsync<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TMember> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.MinAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(TMember));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMinAsync<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<decimal> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.SumAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalSumAsync(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.ToAggregateAsync<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, ISelectGroupingAggregate<T12>, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return Task.FromResult(default(TReturn));
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToAggregateAsync<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<List<TReturn>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        Task<List<TDto>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.ToListAsync<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>).ToListAsync(GetToListDtoSelector<TDto>());
 | 
			
		||||
 | 
			
		||||
        Task<DataTable> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        async Task<bool> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return await this.AnyAsync();
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            var oldwhere = _where.ToString();
 | 
			
		||||
            var ret = await this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)).AnyAsync();
 | 
			
		||||
            _where.Clear().Append(oldwhere);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        async Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.ToOneAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TReturn>> select) => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>).Limit(1).ToListAsync(select)).FirstOrDefault();
 | 
			
		||||
        async Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.FirstAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TReturn>> select) => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>).Limit(1).ToListAsync(select)).FirstOrDefault();
 | 
			
		||||
        async Task<TDto> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>.FirstAsync<TDto>() => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>).Limit(1).ToListAsync<TDto>()).FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,299 @@
 | 
			
		||||
using FreeSql.Internal.Model;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    public abstract class Select13Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> : Select0Provider<ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, T1>, ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>
 | 
			
		||||
            where T1 : class
 | 
			
		||||
            where T2 : class
 | 
			
		||||
            where T3 : class
 | 
			
		||||
            where T4 : class
 | 
			
		||||
            where T5 : class
 | 
			
		||||
            where T6 : class
 | 
			
		||||
            where T7 : class
 | 
			
		||||
            where T8 : class
 | 
			
		||||
            where T9 : class
 | 
			
		||||
            where T10 : class
 | 
			
		||||
            where T11 : class
 | 
			
		||||
            where T12 : class
 | 
			
		||||
            where T13 : class
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        public Select13Provider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere)
 | 
			
		||||
        {
 | 
			
		||||
            if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10), typeof(T11), typeof(T12), typeof(T13));
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T2)), Alias = $"SP10b", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T3)), Alias = $"SP10c", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T4)), Alias = $"SP10d", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T5)), Alias = $"SP10e", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T6)), Alias = $"SP10f", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T7)), Alias = $"SP10g", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T8)), Alias = $"SP10h", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T9)), Alias = $"SP10i", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T10)), Alias = $"SP10j", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T11)), Alias = $"SP10k", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T12)), Alias = $"SP10l", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T13)), Alias = $"SP10m", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.WithSql(string sqlT1, string sqlT2, string sqlT3, string sqlT4, string sqlT5, string sqlT6, string sqlT7, string sqlT8, string sqlT9, string sqlT10, string sqlT11, string sqlT12, string sqlT13, object parms)
 | 
			
		||||
        {
 | 
			
		||||
            this.AsTable((type, old) =>
 | 
			
		||||
            {
 | 
			
		||||
                if (type == _tables[0].Table?.Type) return $"( {sqlT1} )";
 | 
			
		||||
                if (type == _tables[1].Table?.Type) return $"( {sqlT2} )";
 | 
			
		||||
                if (type == _tables[2].Table?.Type) return $"( {sqlT3} )";
 | 
			
		||||
                if (type == _tables[3].Table?.Type) return $"( {sqlT4} )";
 | 
			
		||||
                if (type == _tables[4].Table?.Type) return $"( {sqlT5} )";
 | 
			
		||||
                if (type == _tables[5].Table?.Type) return $"( {sqlT6} )";
 | 
			
		||||
                if (type == _tables[6].Table?.Type) return $"( {sqlT7} )";
 | 
			
		||||
                if (type == _tables[7].Table?.Type) return $"( {sqlT8} )";
 | 
			
		||||
                if (type == _tables[8].Table?.Type) return $"( {sqlT9} )";
 | 
			
		||||
                if (type == _tables[9].Table?.Type) return $"( {sqlT10} )";
 | 
			
		||||
                if (type == _tables[10].Table?.Type) return $"( {sqlT11} )";
 | 
			
		||||
                if (type == _tables[11].Table?.Type) return $"( {sqlT12} )";
 | 
			
		||||
                if (type == _tables[12].Table?.Type) return $"( {sqlT13} )";
 | 
			
		||||
                return old;
 | 
			
		||||
            });
 | 
			
		||||
            if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject($"{sqlT1};\r\n{sqlT2};\r\n{sqlT3};\r\n{sqlT4};\r\n{sqlT5};\r\n{sqlT6};\r\n{sqlT7};\r\n{sqlT8};\r\n{sqlT9};\r\n{sqlT10};\r\n{sqlT11};\r\n{sqlT12};\r\n{sqlT13}", parms));
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        double ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.Avg<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return 0;
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalAvg(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TKey>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>>(exp?.Body);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>>(exp?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return default(TMember);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMax<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.Min<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return default(TMember);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMin<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalOrderBy(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalOrderByDescending(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.OrderByIf<TMember>(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TMember>> column, bool descending)
 | 
			
		||||
        {
 | 
			
		||||
            if (condition == false || column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return descending ? this.InternalOrderByDescending(column?.Body) : this.InternalOrderBy(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        decimal ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.Sum<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalSum(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.ToAggregate<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, ISelectGroupingAggregate<T12>, ISelectGroupingAggregate<T13>, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return default(TReturn);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToAggregate<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.Aggregate<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, ISelectGroupingAggregate<T12>, ISelectGroupingAggregate<T13>, TReturn>> select, out TReturn result)
 | 
			
		||||
        {
 | 
			
		||||
            result = (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>).ToAggregate(select);
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        List<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.ToList<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToList<TReturn>(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToList<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        List<TDto> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.ToList<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>).ToList(GetToListDtoSelector<TDto>());
 | 
			
		||||
        Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TDto>> GetToListDtoSelector<TDto>()
 | 
			
		||||
        {
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TDto>>(
 | 
			
		||||
                typeof(TDto).InternalNewExpression(),
 | 
			
		||||
                _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"),
 | 
			
		||||
                Expression.Parameter(typeof(T2), "b"),
 | 
			
		||||
                Expression.Parameter(typeof(T3), "c"),
 | 
			
		||||
                Expression.Parameter(typeof(T4), "d"),
 | 
			
		||||
                Expression.Parameter(typeof(T5), "e"),
 | 
			
		||||
                Expression.Parameter(typeof(T6), "f"),
 | 
			
		||||
                Expression.Parameter(typeof(T7), "g"),
 | 
			
		||||
                Expression.Parameter(typeof(T8), "h"),
 | 
			
		||||
                Expression.Parameter(typeof(T9), "i"),
 | 
			
		||||
                Expression.Parameter(typeof(T10), "j"),
 | 
			
		||||
                Expression.Parameter(typeof(T11), "k"),
 | 
			
		||||
                Expression.Parameter(typeof(T12), "l"),
 | 
			
		||||
                Expression.Parameter(typeof(T13), "m"));
 | 
			
		||||
        }
 | 
			
		||||
        public void ToChunk<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TReturn>> select, int size, Action<FetchCallbackArgs<List<TReturn>>> done)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null || done == null) return;
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            this.InternalToChunk<TReturn>(select.Body, size, done);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        DataTable ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToDataTable(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToDataTable(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        string ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TReturn>> select, FieldAliasOptions fieldAlias)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToSql<TReturn>(select?.Body, fieldAlias);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToSql<TReturn>(select?.Body, fieldAlias);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.LeftJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.InnerJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.InnerJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.RightJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.RightJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.Where(null);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (condition == false || exp == null) return this.Where(null);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)) : this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        bool ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.Any();
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            var oldwhere = _where.ToString();
 | 
			
		||||
            var ret = this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)).Any();
 | 
			
		||||
            _where.Clear().Append(oldwhere);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.ToOne<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TReturn>> select) => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>).Limit(1).ToList(select).FirstOrDefault();
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.First<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TReturn>> select) => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>).Limit(1).ToList(select).FirstOrDefault();
 | 
			
		||||
        TDto ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.First<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>).Limit(1).ToList<TDto>().FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
#if net40
 | 
			
		||||
#else
 | 
			
		||||
        Task<double> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.AvgAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(double));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalAvgAsync(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TMember> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.MaxAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(TMember));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMaxAsync<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TMember> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.MinAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(TMember));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMinAsync<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<decimal> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.SumAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalSumAsync(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.ToAggregateAsync<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, ISelectGroupingAggregate<T12>, ISelectGroupingAggregate<T13>, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return Task.FromResult(default(TReturn));
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToAggregateAsync<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<List<TReturn>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        Task<List<TDto>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.ToListAsync<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>).ToListAsync(GetToListDtoSelector<TDto>());
 | 
			
		||||
 | 
			
		||||
        Task<DataTable> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        async Task<bool> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return await this.AnyAsync();
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            var oldwhere = _where.ToString();
 | 
			
		||||
            var ret = await this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)).AnyAsync();
 | 
			
		||||
            _where.Clear().Append(oldwhere);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        async Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.ToOneAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TReturn>> select) => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>).Limit(1).ToListAsync(select)).FirstOrDefault();
 | 
			
		||||
        async Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.FirstAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TReturn>> select) => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>).Limit(1).ToListAsync(select)).FirstOrDefault();
 | 
			
		||||
        async Task<TDto> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>.FirstAsync<TDto>() => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>).Limit(1).ToListAsync<TDto>()).FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,303 @@
 | 
			
		||||
using FreeSql.Internal.Model;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    public abstract class Select14Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> : Select0Provider<ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, T1>, ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>
 | 
			
		||||
            where T1 : class
 | 
			
		||||
            where T2 : class
 | 
			
		||||
            where T3 : class
 | 
			
		||||
            where T4 : class
 | 
			
		||||
            where T5 : class
 | 
			
		||||
            where T6 : class
 | 
			
		||||
            where T7 : class
 | 
			
		||||
            where T8 : class
 | 
			
		||||
            where T9 : class
 | 
			
		||||
            where T10 : class
 | 
			
		||||
            where T11 : class
 | 
			
		||||
            where T12 : class
 | 
			
		||||
            where T13 : class
 | 
			
		||||
            where T14 : class
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        public Select14Provider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere)
 | 
			
		||||
        {
 | 
			
		||||
            if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10), typeof(T11), typeof(T12), typeof(T13), typeof(T14));
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T2)), Alias = $"SP10b", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T3)), Alias = $"SP10c", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T4)), Alias = $"SP10d", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T5)), Alias = $"SP10e", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T6)), Alias = $"SP10f", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T7)), Alias = $"SP10g", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T8)), Alias = $"SP10h", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T9)), Alias = $"SP10i", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T10)), Alias = $"SP10j", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T11)), Alias = $"SP10k", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T12)), Alias = $"SP10l", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T13)), Alias = $"SP10m", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T14)), Alias = $"SP10n", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.WithSql(string sqlT1, string sqlT2, string sqlT3, string sqlT4, string sqlT5, string sqlT6, string sqlT7, string sqlT8, string sqlT9, string sqlT10, string sqlT11, string sqlT12, string sqlT13, string sqlT14, object parms)
 | 
			
		||||
        {
 | 
			
		||||
            this.AsTable((type, old) =>
 | 
			
		||||
            {
 | 
			
		||||
                if (type == _tables[0].Table?.Type) return $"( {sqlT1} )";
 | 
			
		||||
                if (type == _tables[1].Table?.Type) return $"( {sqlT2} )";
 | 
			
		||||
                if (type == _tables[2].Table?.Type) return $"( {sqlT3} )";
 | 
			
		||||
                if (type == _tables[3].Table?.Type) return $"( {sqlT4} )";
 | 
			
		||||
                if (type == _tables[4].Table?.Type) return $"( {sqlT5} )";
 | 
			
		||||
                if (type == _tables[5].Table?.Type) return $"( {sqlT6} )";
 | 
			
		||||
                if (type == _tables[6].Table?.Type) return $"( {sqlT7} )";
 | 
			
		||||
                if (type == _tables[7].Table?.Type) return $"( {sqlT8} )";
 | 
			
		||||
                if (type == _tables[8].Table?.Type) return $"( {sqlT9} )";
 | 
			
		||||
                if (type == _tables[9].Table?.Type) return $"( {sqlT10} )";
 | 
			
		||||
                if (type == _tables[10].Table?.Type) return $"( {sqlT11} )";
 | 
			
		||||
                if (type == _tables[11].Table?.Type) return $"( {sqlT12} )";
 | 
			
		||||
                if (type == _tables[12].Table?.Type) return $"( {sqlT13} )";
 | 
			
		||||
                if (type == _tables[13].Table?.Type) return $"( {sqlT14} )";
 | 
			
		||||
                return old;
 | 
			
		||||
            });
 | 
			
		||||
            if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject($"{sqlT1};\r\n{sqlT2};\r\n{sqlT3};\r\n{sqlT4};\r\n{sqlT5};\r\n{sqlT6};\r\n{sqlT7};\r\n{sqlT8};\r\n{sqlT9};\r\n{sqlT10};\r\n{sqlT11};\r\n{sqlT12};\r\n{sqlT13};\r\n{sqlT14}", parms));
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        double ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.Avg<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return 0;
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalAvg(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TKey>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>>(exp?.Body);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>>(exp?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return default(TMember);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMax<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.Min<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return default(TMember);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMin<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalOrderBy(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalOrderByDescending(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.OrderByIf<TMember>(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TMember>> column, bool descending)
 | 
			
		||||
        {
 | 
			
		||||
            if (condition == false || column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return descending ? this.InternalOrderByDescending(column?.Body) : this.InternalOrderBy(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        decimal ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.Sum<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalSum(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.ToAggregate<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, ISelectGroupingAggregate<T12>, ISelectGroupingAggregate<T13>, ISelectGroupingAggregate<T14>, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return default(TReturn);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToAggregate<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.Aggregate<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, ISelectGroupingAggregate<T12>, ISelectGroupingAggregate<T13>, ISelectGroupingAggregate<T14>, TReturn>> select, out TReturn result)
 | 
			
		||||
        {
 | 
			
		||||
            result = (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>).ToAggregate(select);
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        List<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.ToList<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToList<TReturn>(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToList<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        List<TDto> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.ToList<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>).ToList(GetToListDtoSelector<TDto>());
 | 
			
		||||
        Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TDto>> GetToListDtoSelector<TDto>()
 | 
			
		||||
        {
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TDto>>(
 | 
			
		||||
                typeof(TDto).InternalNewExpression(),
 | 
			
		||||
                _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"),
 | 
			
		||||
                Expression.Parameter(typeof(T2), "b"),
 | 
			
		||||
                Expression.Parameter(typeof(T3), "c"),
 | 
			
		||||
                Expression.Parameter(typeof(T4), "d"),
 | 
			
		||||
                Expression.Parameter(typeof(T5), "e"),
 | 
			
		||||
                Expression.Parameter(typeof(T6), "f"),
 | 
			
		||||
                Expression.Parameter(typeof(T7), "g"),
 | 
			
		||||
                Expression.Parameter(typeof(T8), "h"),
 | 
			
		||||
                Expression.Parameter(typeof(T9), "i"),
 | 
			
		||||
                Expression.Parameter(typeof(T10), "j"),
 | 
			
		||||
                Expression.Parameter(typeof(T11), "k"),
 | 
			
		||||
                Expression.Parameter(typeof(T12), "l"),
 | 
			
		||||
                Expression.Parameter(typeof(T13), "m"),
 | 
			
		||||
                Expression.Parameter(typeof(T14), "n"));
 | 
			
		||||
        }
 | 
			
		||||
        public void ToChunk<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TReturn>> select, int size, Action<FetchCallbackArgs<List<TReturn>>> done)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null || done == null) return;
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            this.InternalToChunk<TReturn>(select.Body, size, done);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        DataTable ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToDataTable(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToDataTable(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        string ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TReturn>> select, FieldAliasOptions fieldAlias)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToSql<TReturn>(select?.Body, fieldAlias);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToSql<TReturn>(select?.Body, fieldAlias);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.LeftJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.InnerJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.InnerJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.RightJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.RightJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.Where(null);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (condition == false || exp == null) return this.Where(null);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)) : this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        bool ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.Any();
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            var oldwhere = _where.ToString();
 | 
			
		||||
            var ret = this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)).Any();
 | 
			
		||||
            _where.Clear().Append(oldwhere);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.ToOne<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TReturn>> select) => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>).Limit(1).ToList(select).FirstOrDefault();
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.First<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TReturn>> select) => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>).Limit(1).ToList(select).FirstOrDefault();
 | 
			
		||||
        TDto ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.First<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>).Limit(1).ToList<TDto>().FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
#if net40
 | 
			
		||||
#else
 | 
			
		||||
        Task<double> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.AvgAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(double));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalAvgAsync(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TMember> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.MaxAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(TMember));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMaxAsync<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TMember> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.MinAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(TMember));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMinAsync<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<decimal> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.SumAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalSumAsync(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.ToAggregateAsync<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, ISelectGroupingAggregate<T12>, ISelectGroupingAggregate<T13>, ISelectGroupingAggregate<T14>, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return Task.FromResult(default(TReturn));
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToAggregateAsync<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<List<TReturn>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        Task<List<TDto>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.ToListAsync<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>).ToListAsync(GetToListDtoSelector<TDto>());
 | 
			
		||||
 | 
			
		||||
        Task<DataTable> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        async Task<bool> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return await this.AnyAsync();
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            var oldwhere = _where.ToString();
 | 
			
		||||
            var ret = await this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)).AnyAsync();
 | 
			
		||||
            _where.Clear().Append(oldwhere);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        async Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.ToOneAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TReturn>> select) => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>).Limit(1).ToListAsync(select)).FirstOrDefault();
 | 
			
		||||
        async Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.FirstAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TReturn>> select) => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>).Limit(1).ToListAsync(select)).FirstOrDefault();
 | 
			
		||||
        async Task<TDto> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>.FirstAsync<TDto>() => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>).Limit(1).ToListAsync<TDto>()).FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,307 @@
 | 
			
		||||
using FreeSql.Internal.Model;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    public abstract class Select15Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> : Select0Provider<ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, T1>, ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>
 | 
			
		||||
            where T1 : class
 | 
			
		||||
            where T2 : class
 | 
			
		||||
            where T3 : class
 | 
			
		||||
            where T4 : class
 | 
			
		||||
            where T5 : class
 | 
			
		||||
            where T6 : class
 | 
			
		||||
            where T7 : class
 | 
			
		||||
            where T8 : class
 | 
			
		||||
            where T9 : class
 | 
			
		||||
            where T10 : class
 | 
			
		||||
            where T11 : class
 | 
			
		||||
            where T12 : class
 | 
			
		||||
            where T13 : class
 | 
			
		||||
            where T14 : class
 | 
			
		||||
            where T15 : class
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        public Select15Provider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere)
 | 
			
		||||
        {
 | 
			
		||||
            if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10), typeof(T11), typeof(T12), typeof(T13), typeof(T14), typeof(T15));
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T2)), Alias = $"SP10b", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T3)), Alias = $"SP10c", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T4)), Alias = $"SP10d", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T5)), Alias = $"SP10e", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T6)), Alias = $"SP10f", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T7)), Alias = $"SP10g", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T8)), Alias = $"SP10h", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T9)), Alias = $"SP10i", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T10)), Alias = $"SP10j", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T11)), Alias = $"SP10k", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T12)), Alias = $"SP10l", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T13)), Alias = $"SP10m", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T14)), Alias = $"SP10n", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T15)), Alias = $"SP10o", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.WithSql(string sqlT1, string sqlT2, string sqlT3, string sqlT4, string sqlT5, string sqlT6, string sqlT7, string sqlT8, string sqlT9, string sqlT10, string sqlT11, string sqlT12, string sqlT13, string sqlT14, string sqlT15, object parms)
 | 
			
		||||
        {
 | 
			
		||||
            this.AsTable((type, old) =>
 | 
			
		||||
            {
 | 
			
		||||
                if (type == _tables[0].Table?.Type) return $"( {sqlT1} )";
 | 
			
		||||
                if (type == _tables[1].Table?.Type) return $"( {sqlT2} )";
 | 
			
		||||
                if (type == _tables[2].Table?.Type) return $"( {sqlT3} )";
 | 
			
		||||
                if (type == _tables[3].Table?.Type) return $"( {sqlT4} )";
 | 
			
		||||
                if (type == _tables[4].Table?.Type) return $"( {sqlT5} )";
 | 
			
		||||
                if (type == _tables[5].Table?.Type) return $"( {sqlT6} )";
 | 
			
		||||
                if (type == _tables[6].Table?.Type) return $"( {sqlT7} )";
 | 
			
		||||
                if (type == _tables[7].Table?.Type) return $"( {sqlT8} )";
 | 
			
		||||
                if (type == _tables[8].Table?.Type) return $"( {sqlT9} )";
 | 
			
		||||
                if (type == _tables[9].Table?.Type) return $"( {sqlT10} )";
 | 
			
		||||
                if (type == _tables[10].Table?.Type) return $"( {sqlT11} )";
 | 
			
		||||
                if (type == _tables[11].Table?.Type) return $"( {sqlT12} )";
 | 
			
		||||
                if (type == _tables[12].Table?.Type) return $"( {sqlT13} )";
 | 
			
		||||
                if (type == _tables[13].Table?.Type) return $"( {sqlT14} )";
 | 
			
		||||
                if (type == _tables[14].Table?.Type) return $"( {sqlT15} )";
 | 
			
		||||
                return old;
 | 
			
		||||
            });
 | 
			
		||||
            if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject($"{sqlT1};\r\n{sqlT2};\r\n{sqlT3};\r\n{sqlT4};\r\n{sqlT5};\r\n{sqlT6};\r\n{sqlT7};\r\n{sqlT8};\r\n{sqlT9};\r\n{sqlT10};\r\n{sqlT11};\r\n{sqlT12};\r\n{sqlT13};\r\n{sqlT14};\r\n{sqlT15}", parms));
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        double ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.Avg<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return 0;
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalAvg(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TKey>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>>(exp?.Body);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>>(exp?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return default(TMember);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMax<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.Min<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return default(TMember);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMin<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalOrderBy(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalOrderByDescending(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.OrderByIf<TMember>(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TMember>> column, bool descending)
 | 
			
		||||
        {
 | 
			
		||||
            if (condition == false || column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return descending ? this.InternalOrderByDescending(column?.Body) : this.InternalOrderBy(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        decimal ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.Sum<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalSum(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.ToAggregate<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, ISelectGroupingAggregate<T12>, ISelectGroupingAggregate<T13>, ISelectGroupingAggregate<T14>, ISelectGroupingAggregate<T15>, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return default(TReturn);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToAggregate<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.Aggregate<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, ISelectGroupingAggregate<T12>, ISelectGroupingAggregate<T13>, ISelectGroupingAggregate<T14>, ISelectGroupingAggregate<T15>, TReturn>> select, out TReturn result)
 | 
			
		||||
        {
 | 
			
		||||
            result = (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>).ToAggregate(select);
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        List<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.ToList<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToList<TReturn>(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToList<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        List<TDto> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.ToList<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>).ToList(GetToListDtoSelector<TDto>());
 | 
			
		||||
        Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TDto>> GetToListDtoSelector<TDto>()
 | 
			
		||||
        {
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TDto>>(
 | 
			
		||||
                typeof(TDto).InternalNewExpression(),
 | 
			
		||||
                _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"),
 | 
			
		||||
                Expression.Parameter(typeof(T2), "b"),
 | 
			
		||||
                Expression.Parameter(typeof(T3), "c"),
 | 
			
		||||
                Expression.Parameter(typeof(T4), "d"),
 | 
			
		||||
                Expression.Parameter(typeof(T5), "e"),
 | 
			
		||||
                Expression.Parameter(typeof(T6), "f"),
 | 
			
		||||
                Expression.Parameter(typeof(T7), "g"),
 | 
			
		||||
                Expression.Parameter(typeof(T8), "h"),
 | 
			
		||||
                Expression.Parameter(typeof(T9), "i"),
 | 
			
		||||
                Expression.Parameter(typeof(T10), "j"),
 | 
			
		||||
                Expression.Parameter(typeof(T11), "k"),
 | 
			
		||||
                Expression.Parameter(typeof(T12), "l"),
 | 
			
		||||
                Expression.Parameter(typeof(T13), "m"),
 | 
			
		||||
                Expression.Parameter(typeof(T14), "n"),
 | 
			
		||||
                Expression.Parameter(typeof(T15), "o"));
 | 
			
		||||
        }
 | 
			
		||||
        public void ToChunk<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TReturn>> select, int size, Action<FetchCallbackArgs<List<TReturn>>> done)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null || done == null) return;
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            this.InternalToChunk<TReturn>(select.Body, size, done);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        DataTable ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToDataTable(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToDataTable(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        string ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TReturn>> select, FieldAliasOptions fieldAlias)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToSql<TReturn>(select?.Body, fieldAlias);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToSql<TReturn>(select?.Body, fieldAlias);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.LeftJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.InnerJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.InnerJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.RightJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.RightJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.Where(null);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (condition == false || exp == null) return this.Where(null);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)) : this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        bool ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.Any();
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            var oldwhere = _where.ToString();
 | 
			
		||||
            var ret = this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)).Any();
 | 
			
		||||
            _where.Clear().Append(oldwhere);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.ToOne<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TReturn>> select) => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>).Limit(1).ToList(select).FirstOrDefault();
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.First<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TReturn>> select) => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>).Limit(1).ToList(select).FirstOrDefault();
 | 
			
		||||
        TDto ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.First<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>).Limit(1).ToList<TDto>().FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
#if net40
 | 
			
		||||
#else
 | 
			
		||||
        Task<double> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.AvgAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(double));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalAvgAsync(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TMember> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.MaxAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(TMember));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMaxAsync<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TMember> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.MinAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(TMember));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMinAsync<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<decimal> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.SumAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalSumAsync(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.ToAggregateAsync<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, ISelectGroupingAggregate<T12>, ISelectGroupingAggregate<T13>, ISelectGroupingAggregate<T14>, ISelectGroupingAggregate<T15>, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return Task.FromResult(default(TReturn));
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToAggregateAsync<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<List<TReturn>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        Task<List<TDto>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.ToListAsync<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>).ToListAsync(GetToListDtoSelector<TDto>());
 | 
			
		||||
 | 
			
		||||
        Task<DataTable> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        async Task<bool> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return await this.AnyAsync();
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            var oldwhere = _where.ToString();
 | 
			
		||||
            var ret = await this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)).AnyAsync();
 | 
			
		||||
            _where.Clear().Append(oldwhere);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        async Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.ToOneAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TReturn>> select) => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>).Limit(1).ToListAsync(select)).FirstOrDefault();
 | 
			
		||||
        async Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.FirstAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TReturn>> select) => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>).Limit(1).ToListAsync(select)).FirstOrDefault();
 | 
			
		||||
        async Task<TDto> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>.FirstAsync<TDto>() => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>).Limit(1).ToListAsync<TDto>()).FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,311 @@
 | 
			
		||||
using FreeSql.Internal.Model;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    public abstract class Select16Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> : Select0Provider<ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>, T1>, ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>
 | 
			
		||||
            where T1 : class
 | 
			
		||||
            where T2 : class
 | 
			
		||||
            where T3 : class
 | 
			
		||||
            where T4 : class
 | 
			
		||||
            where T5 : class
 | 
			
		||||
            where T6 : class
 | 
			
		||||
            where T7 : class
 | 
			
		||||
            where T8 : class
 | 
			
		||||
            where T9 : class
 | 
			
		||||
            where T10 : class
 | 
			
		||||
            where T11 : class
 | 
			
		||||
            where T12 : class
 | 
			
		||||
            where T13 : class
 | 
			
		||||
            where T14 : class
 | 
			
		||||
            where T15 : class
 | 
			
		||||
            where T16 : class
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        public Select16Provider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere)
 | 
			
		||||
        {
 | 
			
		||||
            if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10), typeof(T11), typeof(T12), typeof(T13), typeof(T14), typeof(T15), typeof(T16));
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T2)), Alias = $"SP10b", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T3)), Alias = $"SP10c", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T4)), Alias = $"SP10d", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T5)), Alias = $"SP10e", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T6)), Alias = $"SP10f", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T7)), Alias = $"SP10g", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T8)), Alias = $"SP10h", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T9)), Alias = $"SP10i", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T10)), Alias = $"SP10j", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T11)), Alias = $"SP10k", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T12)), Alias = $"SP10l", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T13)), Alias = $"SP10m", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T14)), Alias = $"SP10n", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T15)), Alias = $"SP10o", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
            _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T16)), Alias = $"SP10p", On = null, Type = SelectTableInfoType.From });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.WithSql(string sqlT1, string sqlT2, string sqlT3, string sqlT4, string sqlT5, string sqlT6, string sqlT7, string sqlT8, string sqlT9, string sqlT10, string sqlT11, string sqlT12, string sqlT13, string sqlT14, string sqlT15, string sqlT16, object parms)
 | 
			
		||||
        {
 | 
			
		||||
            this.AsTable((type, old) =>
 | 
			
		||||
            {
 | 
			
		||||
                if (type == _tables[0].Table?.Type) return $"( {sqlT1} )";
 | 
			
		||||
                if (type == _tables[1].Table?.Type) return $"( {sqlT2} )";
 | 
			
		||||
                if (type == _tables[2].Table?.Type) return $"( {sqlT3} )";
 | 
			
		||||
                if (type == _tables[3].Table?.Type) return $"( {sqlT4} )";
 | 
			
		||||
                if (type == _tables[4].Table?.Type) return $"( {sqlT5} )";
 | 
			
		||||
                if (type == _tables[5].Table?.Type) return $"( {sqlT6} )";
 | 
			
		||||
                if (type == _tables[6].Table?.Type) return $"( {sqlT7} )";
 | 
			
		||||
                if (type == _tables[7].Table?.Type) return $"( {sqlT8} )";
 | 
			
		||||
                if (type == _tables[8].Table?.Type) return $"( {sqlT9} )";
 | 
			
		||||
                if (type == _tables[9].Table?.Type) return $"( {sqlT10} )";
 | 
			
		||||
                if (type == _tables[10].Table?.Type) return $"( {sqlT11} )";
 | 
			
		||||
                if (type == _tables[11].Table?.Type) return $"( {sqlT12} )";
 | 
			
		||||
                if (type == _tables[12].Table?.Type) return $"( {sqlT13} )";
 | 
			
		||||
                if (type == _tables[13].Table?.Type) return $"( {sqlT14} )";
 | 
			
		||||
                if (type == _tables[14].Table?.Type) return $"( {sqlT15} )";
 | 
			
		||||
                if (type == _tables[15].Table?.Type) return $"( {sqlT16} )";
 | 
			
		||||
                return old;
 | 
			
		||||
            });
 | 
			
		||||
            if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject($"{sqlT1};\r\n{sqlT2};\r\n{sqlT3};\r\n{sqlT4};\r\n{sqlT5};\r\n{sqlT6};\r\n{sqlT7};\r\n{sqlT8};\r\n{sqlT9};\r\n{sqlT10};\r\n{sqlT11};\r\n{sqlT12};\r\n{sqlT13};\r\n{sqlT14};\r\n{sqlT15};\r\n{sqlT16}", parms));
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        double ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.Avg<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return 0;
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalAvg(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelectGrouping<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.GroupBy<TKey>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TKey>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>>(exp?.Body);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalGroupBy<TKey, NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>>(exp?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.Max<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return default(TMember);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMax<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TMember ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.Min<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return default(TMember);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMin<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.OrderBy<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalOrderBy(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.OrderByDescending<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalOrderByDescending(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.OrderByIf<TMember>(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TMember>> column, bool descending)
 | 
			
		||||
        {
 | 
			
		||||
            if (condition == false || column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return descending ? this.InternalOrderByDescending(column?.Body) : this.InternalOrderBy(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        decimal ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.Sum<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalSum(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.ToAggregate<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, ISelectGroupingAggregate<T12>, ISelectGroupingAggregate<T13>, ISelectGroupingAggregate<T14>, ISelectGroupingAggregate<T15>, ISelectGroupingAggregate<T16>, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return default(TReturn);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToAggregate<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.Aggregate<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, ISelectGroupingAggregate<T12>, ISelectGroupingAggregate<T13>, ISelectGroupingAggregate<T14>, ISelectGroupingAggregate<T15>, ISelectGroupingAggregate<T16>, TReturn>> select, out TReturn result)
 | 
			
		||||
        {
 | 
			
		||||
            result = (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>).ToAggregate(select);
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        List<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.ToList<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToList<TReturn>(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToList<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        List<TDto> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.ToList<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>).ToList(GetToListDtoSelector<TDto>());
 | 
			
		||||
        Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TDto>> GetToListDtoSelector<TDto>()
 | 
			
		||||
        {
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TDto>>(
 | 
			
		||||
                typeof(TDto).InternalNewExpression(),
 | 
			
		||||
                _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"),
 | 
			
		||||
                Expression.Parameter(typeof(T2), "b"),
 | 
			
		||||
                Expression.Parameter(typeof(T3), "c"),
 | 
			
		||||
                Expression.Parameter(typeof(T4), "d"),
 | 
			
		||||
                Expression.Parameter(typeof(T5), "e"),
 | 
			
		||||
                Expression.Parameter(typeof(T6), "f"),
 | 
			
		||||
                Expression.Parameter(typeof(T7), "g"),
 | 
			
		||||
                Expression.Parameter(typeof(T8), "h"),
 | 
			
		||||
                Expression.Parameter(typeof(T9), "i"),
 | 
			
		||||
                Expression.Parameter(typeof(T10), "j"),
 | 
			
		||||
                Expression.Parameter(typeof(T11), "k"),
 | 
			
		||||
                Expression.Parameter(typeof(T12), "l"),
 | 
			
		||||
                Expression.Parameter(typeof(T13), "m"),
 | 
			
		||||
                Expression.Parameter(typeof(T14), "n"),
 | 
			
		||||
                Expression.Parameter(typeof(T15), "o"),
 | 
			
		||||
                Expression.Parameter(typeof(T16), "p"));
 | 
			
		||||
        }
 | 
			
		||||
        public void ToChunk<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TReturn>> select, int size, Action<FetchCallbackArgs<List<TReturn>>> done)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null || done == null) return;
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            this.InternalToChunk<TReturn>(select.Body, size, done);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        DataTable ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToDataTable(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToDataTable(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        string ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TReturn>> select, FieldAliasOptions fieldAlias)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToSql<TReturn>(select?.Body, fieldAlias);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToSql<TReturn>(select?.Body, fieldAlias);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.LeftJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.InnerJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.InnerJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.RightJoin(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.InternalJoin(exp?.Body, SelectTableInfoType.RightJoin);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.Where(null);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.WhereIf(bool condition, Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (condition == false || exp == null) return this.Where(null);
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            return condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)) : this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        bool ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return this.Any();
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            var oldwhere = _where.ToString();
 | 
			
		||||
            var ret = this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)).Any();
 | 
			
		||||
            _where.Clear().Append(oldwhere);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.ToOne<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TReturn>> select) => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>).Limit(1).ToList(select).FirstOrDefault();
 | 
			
		||||
        TReturn ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.First<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TReturn>> select) => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>).Limit(1).ToList(select).FirstOrDefault();
 | 
			
		||||
        TDto ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.First<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>).Limit(1).ToList<TDto>().FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
#if net40
 | 
			
		||||
#else
 | 
			
		||||
        Task<double> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.AvgAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(double));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalAvgAsync(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TMember> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.MaxAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(TMember));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMaxAsync<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TMember> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.MinAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(TMember));
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalMinAsync<TMember>(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<decimal> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.SumAsync<TMember>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) this.InternalOrderBy(column?.Body);
 | 
			
		||||
            for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a];
 | 
			
		||||
            return this.InternalSumAsync(column?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.ToAggregateAsync<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, ISelectGroupingAggregate<T2>, ISelectGroupingAggregate<T3>, ISelectGroupingAggregate<T4>, ISelectGroupingAggregate<T5>, ISelectGroupingAggregate<T6>, ISelectGroupingAggregate<T7>, ISelectGroupingAggregate<T8>, ISelectGroupingAggregate<T9>, ISelectGroupingAggregate<T10>, ISelectGroupingAggregate<T11>, ISelectGroupingAggregate<T12>, ISelectGroupingAggregate<T13>, ISelectGroupingAggregate<T14>, ISelectGroupingAggregate<T15>, ISelectGroupingAggregate<T16>, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return Task.FromResult(default(TReturn));
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToAggregateAsync<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Task<List<TReturn>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
        Task<List<TDto>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.ToListAsync<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>).ToListAsync(GetToListDtoSelector<TDto>());
 | 
			
		||||
 | 
			
		||||
        Task<DataTable> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TReturn>> select)
 | 
			
		||||
        {
 | 
			
		||||
            if (select == null) return this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
            for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a];
 | 
			
		||||
            return this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        async Task<bool> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, bool>> exp)
 | 
			
		||||
        {
 | 
			
		||||
            if (exp == null) return await this.AnyAsync();
 | 
			
		||||
            for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a];
 | 
			
		||||
            var oldwhere = _where.ToString();
 | 
			
		||||
            var ret = await this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _params)).AnyAsync();
 | 
			
		||||
            _where.Clear().Append(oldwhere);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        async Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.ToOneAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TReturn>> select) => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>).Limit(1).ToListAsync(select)).FirstOrDefault();
 | 
			
		||||
        async Task<TReturn> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.FirstAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TReturn>> select) => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>).Limit(1).ToListAsync(select)).FirstOrDefault();
 | 
			
		||||
        async Task<TDto> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>.FirstAsync<TDto>() => (await (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>).Limit(1).ToListAsync<TDto>()).FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -119,6 +119,13 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        public abstract ISelect<T1, T2, T3, T4, T5, T6, T7, T8> From<T2, T3, T4, T5, T6, T7, T8>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class;
 | 
			
		||||
        public abstract ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> From<T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class;
 | 
			
		||||
        public abstract ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> From<T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class;
 | 
			
		||||
        
 | 
			
		||||
        public abstract ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> From<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class;
 | 
			
		||||
        public abstract ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> From<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class;
 | 
			
		||||
        public abstract ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> From<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class where T13 : class;
 | 
			
		||||
        public abstract ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> From<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class where T13 : class where T14 : class;
 | 
			
		||||
        public abstract ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> From<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class where T13 : class where T14 : class where T15 : class;
 | 
			
		||||
        public abstract ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> From<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, ISelectFromExpression<T1>>> exp) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class where T13 : class where T14 : class where T15 : class where T16 : class;
 | 
			
		||||
 | 
			
		||||
        public ISelectGrouping<TKey, T1> GroupBy<TKey>(Expression<Func<T1, TKey>> columns)
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,13 @@ namespace FreeSql.Internal.Model
 | 
			
		||||
        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 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 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 static NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Create<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9, T10 item10, T11 item11) => new NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11);
 | 
			
		||||
        public static NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Create<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9, T10 item10, T11 item11, T12 item12) => new NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12);
 | 
			
		||||
        public static NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Create<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9, T10 item10, T11 item11, T12 item12, T13 item13) => new NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13);
 | 
			
		||||
        public static NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Create<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9, T10 item10, T11 item11, T12 item12, T13 item13, T14 item14) => new NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14);
 | 
			
		||||
        public static NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> Create<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9, T10 item10, T11 item11, T12 item12, T13 item13, T14 item14, T15 item15) => new NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15);
 | 
			
		||||
        public static NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> Create<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9, T10 item10, T11 item11, T12 item12, T13 item13, T14 item14, T15 item15, T16 item16) => new NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>(item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class NativeTuple<T1, T2>
 | 
			
		||||
@@ -179,4 +186,202 @@ namespace FreeSql.Internal.Model
 | 
			
		||||
            Item10 = item10;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    public class NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>
 | 
			
		||||
    {
 | 
			
		||||
        public T1 Item1 { get; }
 | 
			
		||||
        public T2 Item2 { get; }
 | 
			
		||||
        public T3 Item3 { get; }
 | 
			
		||||
        public T4 Item4 { get; }
 | 
			
		||||
        public T5 Item5 { get; }
 | 
			
		||||
        public T6 Item6 { get; }
 | 
			
		||||
        public T7 Item7 { get; }
 | 
			
		||||
        public T8 Item8 { get; }
 | 
			
		||||
        public T9 Item9 { get; }
 | 
			
		||||
        public T10 Item10 { get; }
 | 
			
		||||
        public T11 Item11 { get; }
 | 
			
		||||
        public NativeTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9, T10 item10, T11 item11)
 | 
			
		||||
        {
 | 
			
		||||
            Item1 = item1;
 | 
			
		||||
            Item2 = item2;
 | 
			
		||||
            Item3 = item3;
 | 
			
		||||
            Item4 = item4;
 | 
			
		||||
            Item5 = item5;
 | 
			
		||||
            Item6 = item6;
 | 
			
		||||
            Item7 = item7;
 | 
			
		||||
            Item8 = item8;
 | 
			
		||||
            Item9 = item9;
 | 
			
		||||
            Item10 = item10;
 | 
			
		||||
            Item11 = item11;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    public class NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>
 | 
			
		||||
    {
 | 
			
		||||
        public T1 Item1 { get; }
 | 
			
		||||
        public T2 Item2 { get; }
 | 
			
		||||
        public T3 Item3 { get; }
 | 
			
		||||
        public T4 Item4 { get; }
 | 
			
		||||
        public T5 Item5 { get; }
 | 
			
		||||
        public T6 Item6 { get; }
 | 
			
		||||
        public T7 Item7 { get; }
 | 
			
		||||
        public T8 Item8 { get; }
 | 
			
		||||
        public T9 Item9 { get; }
 | 
			
		||||
        public T10 Item10 { get; }
 | 
			
		||||
        public T11 Item11 { get; }
 | 
			
		||||
        public T12 Item12 { get; }
 | 
			
		||||
        public NativeTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9, T10 item10, T11 item11, T12 item12)
 | 
			
		||||
        {
 | 
			
		||||
            Item1 = item1;
 | 
			
		||||
            Item2 = item2;
 | 
			
		||||
            Item3 = item3;
 | 
			
		||||
            Item4 = item4;
 | 
			
		||||
            Item5 = item5;
 | 
			
		||||
            Item6 = item6;
 | 
			
		||||
            Item7 = item7;
 | 
			
		||||
            Item8 = item8;
 | 
			
		||||
            Item9 = item9;
 | 
			
		||||
            Item10 = item10;
 | 
			
		||||
            Item11 = item11;
 | 
			
		||||
            Item12 = item12;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    public class NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>
 | 
			
		||||
    {
 | 
			
		||||
        public T1 Item1 { get; }
 | 
			
		||||
        public T2 Item2 { get; }
 | 
			
		||||
        public T3 Item3 { get; }
 | 
			
		||||
        public T4 Item4 { get; }
 | 
			
		||||
        public T5 Item5 { get; }
 | 
			
		||||
        public T6 Item6 { get; }
 | 
			
		||||
        public T7 Item7 { get; }
 | 
			
		||||
        public T8 Item8 { get; }
 | 
			
		||||
        public T9 Item9 { get; }
 | 
			
		||||
        public T10 Item10 { get; }
 | 
			
		||||
        public T11 Item11 { get; }
 | 
			
		||||
        public T12 Item12 { get; }
 | 
			
		||||
        public T13 Item13 { get; }
 | 
			
		||||
        public NativeTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9, T10 item10, T11 item11, T12 item12, T13 item13)
 | 
			
		||||
        {
 | 
			
		||||
            Item1 = item1;
 | 
			
		||||
            Item2 = item2;
 | 
			
		||||
            Item3 = item3;
 | 
			
		||||
            Item4 = item4;
 | 
			
		||||
            Item5 = item5;
 | 
			
		||||
            Item6 = item6;
 | 
			
		||||
            Item7 = item7;
 | 
			
		||||
            Item8 = item8;
 | 
			
		||||
            Item9 = item9;
 | 
			
		||||
            Item10 = item10;
 | 
			
		||||
            Item11 = item11;
 | 
			
		||||
            Item12 = item12;
 | 
			
		||||
            Item13 = item13;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    public class NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>
 | 
			
		||||
    {
 | 
			
		||||
        public T1 Item1 { get; }
 | 
			
		||||
        public T2 Item2 { get; }
 | 
			
		||||
        public T3 Item3 { get; }
 | 
			
		||||
        public T4 Item4 { get; }
 | 
			
		||||
        public T5 Item5 { get; }
 | 
			
		||||
        public T6 Item6 { get; }
 | 
			
		||||
        public T7 Item7 { get; }
 | 
			
		||||
        public T8 Item8 { get; }
 | 
			
		||||
        public T9 Item9 { get; }
 | 
			
		||||
        public T10 Item10 { get; }
 | 
			
		||||
        public T11 Item11 { get; }
 | 
			
		||||
        public T12 Item12 { get; }
 | 
			
		||||
        public T13 Item13 { get; }
 | 
			
		||||
        public T14 Item14 { get; }
 | 
			
		||||
        public NativeTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9, T10 item10, T11 item11, T12 item12, T13 item13, T14 item14)
 | 
			
		||||
        {
 | 
			
		||||
            Item1 = item1;
 | 
			
		||||
            Item2 = item2;
 | 
			
		||||
            Item3 = item3;
 | 
			
		||||
            Item4 = item4;
 | 
			
		||||
            Item5 = item5;
 | 
			
		||||
            Item6 = item6;
 | 
			
		||||
            Item7 = item7;
 | 
			
		||||
            Item8 = item8;
 | 
			
		||||
            Item9 = item9;
 | 
			
		||||
            Item10 = item10;
 | 
			
		||||
            Item11 = item11;
 | 
			
		||||
            Item12 = item12;
 | 
			
		||||
            Item13 = item13;
 | 
			
		||||
            Item14 = item14;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    public class NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>
 | 
			
		||||
    {
 | 
			
		||||
        public T1 Item1 { get; }
 | 
			
		||||
        public T2 Item2 { get; }
 | 
			
		||||
        public T3 Item3 { get; }
 | 
			
		||||
        public T4 Item4 { get; }
 | 
			
		||||
        public T5 Item5 { get; }
 | 
			
		||||
        public T6 Item6 { get; }
 | 
			
		||||
        public T7 Item7 { get; }
 | 
			
		||||
        public T8 Item8 { get; }
 | 
			
		||||
        public T9 Item9 { get; }
 | 
			
		||||
        public T10 Item10 { get; }
 | 
			
		||||
        public T11 Item11 { get; }
 | 
			
		||||
        public T12 Item12 { get; }
 | 
			
		||||
        public T13 Item13 { get; }
 | 
			
		||||
        public T14 Item14 { get; }
 | 
			
		||||
        public T15 Item15 { get; }
 | 
			
		||||
        public NativeTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9, T10 item10, T11 item11, T12 item12, T13 item13, T14 item14, T15 item15)
 | 
			
		||||
        {
 | 
			
		||||
            Item1 = item1;
 | 
			
		||||
            Item2 = item2;
 | 
			
		||||
            Item3 = item3;
 | 
			
		||||
            Item4 = item4;
 | 
			
		||||
            Item5 = item5;
 | 
			
		||||
            Item6 = item6;
 | 
			
		||||
            Item7 = item7;
 | 
			
		||||
            Item8 = item8;
 | 
			
		||||
            Item9 = item9;
 | 
			
		||||
            Item10 = item10;
 | 
			
		||||
            Item11 = item11;
 | 
			
		||||
            Item12 = item12;
 | 
			
		||||
            Item13 = item13;
 | 
			
		||||
            Item14 = item14;
 | 
			
		||||
            Item15 = item15;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    public class NativeTuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>
 | 
			
		||||
    {
 | 
			
		||||
        public T1 Item1 { get; }
 | 
			
		||||
        public T2 Item2 { get; }
 | 
			
		||||
        public T3 Item3 { get; }
 | 
			
		||||
        public T4 Item4 { get; }
 | 
			
		||||
        public T5 Item5 { get; }
 | 
			
		||||
        public T6 Item6 { get; }
 | 
			
		||||
        public T7 Item7 { get; }
 | 
			
		||||
        public T8 Item8 { get; }
 | 
			
		||||
        public T9 Item9 { get; }
 | 
			
		||||
        public T10 Item10 { get; }
 | 
			
		||||
        public T11 Item11 { get; }
 | 
			
		||||
        public T12 Item12 { get; }
 | 
			
		||||
        public T13 Item13 { get; }
 | 
			
		||||
        public T14 Item14 { get; }
 | 
			
		||||
        public T15 Item15 { get; }
 | 
			
		||||
        public T16 Item16 { get; }
 | 
			
		||||
        public NativeTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8, T9 item9, T10 item10, T11 item11, T12 item12, T13 item13, T14 item14, T15 item15, T16 item16)
 | 
			
		||||
        {
 | 
			
		||||
            Item1 = item1;
 | 
			
		||||
            Item2 = item2;
 | 
			
		||||
            Item3 = item3;
 | 
			
		||||
            Item4 = item4;
 | 
			
		||||
            Item5 = item5;
 | 
			
		||||
            Item6 = item6;
 | 
			
		||||
            Item7 = item7;
 | 
			
		||||
            Item8 = item8;
 | 
			
		||||
            Item9 = item9;
 | 
			
		||||
            Item10 = item10;
 | 
			
		||||
            Item11 = item11;
 | 
			
		||||
            Item12 = item12;
 | 
			
		||||
            Item13 = item13;
 | 
			
		||||
            Item14 = item14;
 | 
			
		||||
            Item15 = item15;
 | 
			
		||||
            Item16 = item16;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user