mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 优化 IncludeMany 级联查询支持异步适配(之前是同步方式);
This commit is contained in:
		@@ -210,5 +210,16 @@ public static partial class FreeSqlGlobalExtensions
 | 
			
		||||
        select.SetList(list);
 | 
			
		||||
        return list;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if net40
 | 
			
		||||
#else
 | 
			
		||||
    async public static System.Threading.Tasks.Task<List<T1>> IncludeManyAsync<T1, TNavigate>(this List<T1> list, IFreeSql orm, Expression<Func<T1, IEnumerable<TNavigate>>> navigateSelector, Action<ISelect<TNavigate>> then = null) where T1 : class where TNavigate : class
 | 
			
		||||
    {
 | 
			
		||||
        if (list == null || list.Any() == false) return list;
 | 
			
		||||
        var select = orm.Select<T1>().IncludeMany(navigateSelector, then) as FreeSql.Internal.CommonProvider.Select1Provider<T1>;
 | 
			
		||||
        await select.SetListAsync(list);
 | 
			
		||||
        return list;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
    #endregion
 | 
			
		||||
}
 | 
			
		||||
@@ -2049,6 +2049,137 @@
 | 
			
		||||
            <param name="parms"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{System.Data.Common.DbDataReader,System.Threading.Tasks.Task},System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
 | 
			
		||||
            <summary>
 | 
			
		||||
            查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="readerHander"></param>
 | 
			
		||||
            <param name="cmdType"></param>
 | 
			
		||||
            <param name="cmdText"></param>
 | 
			
		||||
            <param name="cmdParms"></param>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{System.Data.Common.DbDataReader,System.Threading.Tasks.Task},System.String,System.Object)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 })
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="cmdText"></param>
 | 
			
		||||
            <param name="parms"></param>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IAdo.ExecuteArrayAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
 | 
			
		||||
            <summary>
 | 
			
		||||
            查询
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="cmdText"></param>
 | 
			
		||||
            <param name="cmdParms"></param>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IAdo.ExecuteArrayAsync(System.String,System.Object)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 })
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="cmdText"></param>
 | 
			
		||||
            <param name="parms"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IAdo.ExecuteDataSetAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
 | 
			
		||||
            <summary>
 | 
			
		||||
            查询
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="cmdText"></param>
 | 
			
		||||
            <param name="cmdParms"></param>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IAdo.ExecuteDataSetAsync(System.String,System.Object)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 })
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="cmdText"></param>
 | 
			
		||||
            <param name="parms"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IAdo.ExecuteDataTableAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
 | 
			
		||||
            <summary>
 | 
			
		||||
            查询
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="cmdText"></param>
 | 
			
		||||
            <param name="cmdParms"></param>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IAdo.ExecuteDataTableAsync(System.String,System.Object)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 })
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="cmdText"></param>
 | 
			
		||||
            <param name="parms"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IAdo.ExecuteNonQueryAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
 | 
			
		||||
            <summary>
 | 
			
		||||
            在【主库】执行
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="cmdType"></param>
 | 
			
		||||
            <param name="cmdText"></param>
 | 
			
		||||
            <param name="cmdParms"></param>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IAdo.ExecuteNonQueryAsync(System.String,System.Object)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 })
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="cmdText"></param>
 | 
			
		||||
            <param name="parms"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IAdo.ExecuteScalarAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
 | 
			
		||||
            <summary>
 | 
			
		||||
            在【主库】执行
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="cmdType"></param>
 | 
			
		||||
            <param name="cmdText"></param>
 | 
			
		||||
            <param name="cmdParms"></param>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IAdo.ExecuteScalarAsync(System.String,System.Object)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 })
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="cmdText"></param>
 | 
			
		||||
            <param name="parms"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IAdo.QueryAsync``1(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
 | 
			
		||||
            <summary>
 | 
			
		||||
            执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 })
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T"></typeparam>
 | 
			
		||||
            <param name="cmdType"></param>
 | 
			
		||||
            <param name="cmdText"></param>
 | 
			
		||||
            <param name="cmdParms"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IAdo.QueryAsync``1(System.String,System.Object)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 })
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T"></typeparam>
 | 
			
		||||
            <param name="cmdText"></param>
 | 
			
		||||
            <param name="parms"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IAdo.QueryAsync``2(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
 | 
			
		||||
            <summary>
 | 
			
		||||
            执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 })
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T1"></typeparam>
 | 
			
		||||
            <param name="cmdType"></param>
 | 
			
		||||
            <param name="cmdText"></param>
 | 
			
		||||
            <param name="cmdParms"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IAdo.QueryAsync``2(System.String,System.Object)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new { age = 25 })
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T1"></typeparam>
 | 
			
		||||
            <param name="cmdText"></param>
 | 
			
		||||
            <param name="parms"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="P:FreeSql.IAop.ParseExpression">
 | 
			
		||||
            <summary>
 | 
			
		||||
            可自定义解析表达式
 | 
			
		||||
@@ -2764,159 +2895,3 @@
 | 
			
		||||
        </member>
 | 
			
		||||
    </members>
 | 
			
		||||
</doc>
 | 
			
		||||
 </member>
 | 
			
		||||
        <member name="M:System.Linq.Expressions.LambadaExpressionExtensions.Or``1(System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
 | 
			
		||||
            <summary>
 | 
			
		||||
            使用 or 拼接两个 lambda 表达式
 | 
			
		||||
            </summary>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:System.Linq.Expressions.LambadaExpressionExtensions.Or``1(System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Boolean,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
 | 
			
		||||
            <summary>
 | 
			
		||||
            使用 or 拼接两个 lambda 表达式
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T"></typeparam>
 | 
			
		||||
            <param name="exp1"></param>
 | 
			
		||||
            <param name="condition">true 时生效</param>
 | 
			
		||||
            <param name="exp2"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:System.Linq.Expressions.LambadaExpressionExtensions.Not``1(System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Boolean)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            将 lambda 表达式取反
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T"></typeparam>
 | 
			
		||||
            <param name="exp"></param>
 | 
			
		||||
            <param name="condition">true 时生效</param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeUtil.NewMongodbId">
 | 
			
		||||
            <summary>
 | 
			
		||||
            生成类似Mongodb的ObjectId有序、不重复Guid
 | 
			
		||||
            </summary>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:IFreeSql.Insert``1">
 | 
			
		||||
            <summary>
 | 
			
		||||
            插入数据
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T1"></typeparam>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:IFreeSql.Insert``1(``0)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            插入数据,传入实体
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T1"></typeparam>
 | 
			
		||||
            <param name="source"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:IFreeSql.Insert``1(``0[])">
 | 
			
		||||
            <summary>
 | 
			
		||||
            插入数据,传入实体数组
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T1"></typeparam>
 | 
			
		||||
            <param name="source"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:IFreeSql.Insert``1(System.Collections.Generic.List{``0})">
 | 
			
		||||
            <summary>
 | 
			
		||||
            插入数据,传入实体集合
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T1"></typeparam>
 | 
			
		||||
            <param name="source"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:IFreeSql.Insert``1(System.Collections.Generic.IEnumerable{``0})">
 | 
			
		||||
            <summary>
 | 
			
		||||
            插入数据,传入实体集合
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T1"></typeparam>
 | 
			
		||||
            <param name="source"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:IFreeSql.Update``1">
 | 
			
		||||
            <summary>
 | 
			
		||||
            修改数据
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T1"></typeparam>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:IFreeSql.Update``1(System.Object)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            修改数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T1"></typeparam>
 | 
			
		||||
            <param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:IFreeSql.Select``1">
 | 
			
		||||
            <summary>
 | 
			
		||||
            查询数据
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T1"></typeparam>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:IFreeSql.Select``1(System.Object)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            查询数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T1"></typeparam>
 | 
			
		||||
            <param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:IFreeSql.Delete``1">
 | 
			
		||||
            <summary>
 | 
			
		||||
            删除数据
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T1"></typeparam>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:IFreeSql.Delete``1(System.Object)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            删除数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T1"></typeparam>
 | 
			
		||||
            <param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:IFreeSql.Transaction(System.Action)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            开启事务(不支持异步),60秒未执行完将自动提交
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="handler">事务体 () => {}</param>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:IFreeSql.Transaction(System.Action,System.TimeSpan)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            开启事务(不支持异步)
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="handler">事务体 () => {}</param>
 | 
			
		||||
            <param name="timeout">超时,未执行完将自动提交</param>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="P:IFreeSql.Ado">
 | 
			
		||||
            <summary>
 | 
			
		||||
            数据库访问对象
 | 
			
		||||
            </summary>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="P:IFreeSql.Aop">
 | 
			
		||||
            <summary>
 | 
			
		||||
            所有拦截方法都在这里
 | 
			
		||||
            </summary>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="P:IFreeSql.CodeFirst">
 | 
			
		||||
            <summary>
 | 
			
		||||
            CodeFirst 模式开发相关方法
 | 
			
		||||
            </summary>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="P:IFreeSql.DbFirst">
 | 
			
		||||
            <summary>
 | 
			
		||||
            DbFirst 模式开发相关方法
 | 
			
		||||
            </summary>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="P:IFreeSql.GlobalFilter">
 | 
			
		||||
            <summary>
 | 
			
		||||
            全局过滤设置,可默认附加为 Select/Update/Delete 条件
 | 
			
		||||
            </summary>
 | 
			
		||||
        </member>
 | 
			
		||||
    </members>
 | 
			
		||||
</doc>
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,10 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        protected DbConnection _connection;
 | 
			
		||||
        protected Action<object> _trackToList;
 | 
			
		||||
        protected List<Action<object>> _includeToList = new List<Action<object>>();
 | 
			
		||||
#if net40
 | 
			
		||||
#else
 | 
			
		||||
        protected List<Func<object, Task>> _includeToListAsync = new List<Func<object, Task>>();
 | 
			
		||||
#endif
 | 
			
		||||
        protected bool _distinct;
 | 
			
		||||
        protected Expression _selectExpression;
 | 
			
		||||
        protected List<LambdaExpression> _whereCascadeExpression = new List<LambdaExpression>();
 | 
			
		||||
@@ -50,6 +54,10 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
            _join.Clear();
 | 
			
		||||
            _trackToList = null;
 | 
			
		||||
            _includeToList.Clear();
 | 
			
		||||
#if net40
 | 
			
		||||
#else
 | 
			
		||||
            _includeToListAsync.Clear();
 | 
			
		||||
#endif
 | 
			
		||||
            _selectExpression = null;
 | 
			
		||||
            _whereCascadeExpression.Clear();
 | 
			
		||||
            _whereGlobalFilter = _orm.GlobalFilter.GetFilters();
 | 
			
		||||
@@ -104,6 +112,10 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
            toType.GetField("_connection", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._connection);
 | 
			
		||||
            toType.GetField("_trackToList", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._trackToList);
 | 
			
		||||
            toType.GetField("_includeToList", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._includeToList);
 | 
			
		||||
#if net40
 | 
			
		||||
#else
 | 
			
		||||
            toType.GetField("_includeToListAsync", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._includeToListAsync);
 | 
			
		||||
#endif
 | 
			
		||||
            toType.GetField("_distinct", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._distinct);
 | 
			
		||||
            toType.GetField("_selectExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._selectExpression);
 | 
			
		||||
            toType.GetField("_whereCascadeExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._whereCascadeExpression);
 | 
			
		||||
@@ -1154,7 +1166,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                var after = new Aop.CurdAfterEventArgs(before, exception, ret);
 | 
			
		||||
                _orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
            }
 | 
			
		||||
            foreach (var include in _includeToList) include?.Invoke(ret);
 | 
			
		||||
            foreach (var include in _includeToListAsync) await include?.Invoke(ret);
 | 
			
		||||
            _trackToList?.Invoke(ret);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
@@ -1220,7 +1232,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                _orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
            }
 | 
			
		||||
            if (typeof(TReturn) == typeof(T1))
 | 
			
		||||
                foreach (var include in _includeToList) include?.Invoke(ret);
 | 
			
		||||
                foreach (var include in _includeToListAsync) await include?.Invoke(ret);
 | 
			
		||||
            _trackToList?.Invoke(ret);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -533,9 +533,16 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                }
 | 
			
		||||
                if (tbref.Columns.Any() == false) throw throwNavigateSelector;
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            _includeToList.Add(listObj =>
 | 
			
		||||
 | 
			
		||||
#if net40
 | 
			
		||||
            Action<object, bool> includeToListSyncOrAsync = (listObj, isAsync) =>
 | 
			
		||||
            {
 | 
			
		||||
                isAsync = false;
 | 
			
		||||
#else
 | 
			
		||||
            Func<object, bool, Task> includeToListSyncOrAsync = async (listObj, isAsync) =>
 | 
			
		||||
            {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
                var list = listObj as List<T1>;
 | 
			
		||||
                if (list == null) return;
 | 
			
		||||
                if (list.Any() == false) return;
 | 
			
		||||
@@ -576,7 +583,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                        Expression.Block(
 | 
			
		||||
                            Expression.Return(returnTarget, Expression.Call(null, GetEntityValueWithPropertyNameMethod, Expression.Constant(_orm), Expression.Constant(membersExp.Type), membersExp, propertyNameExp)),
 | 
			
		||||
                            Expression.Label(returnTarget, Expression.Default(typeof(object)))
 | 
			
		||||
                        ), t1parm, propertyNameExp).Compile():
 | 
			
		||||
                        ), t1parm, propertyNameExp).Compile() :
 | 
			
		||||
                    Expression.Lambda<Func<T1, string, object>>(
 | 
			
		||||
                        Expression.Block(
 | 
			
		||||
                            Expression.IfThen(
 | 
			
		||||
@@ -700,8 +707,20 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                                sbSql.Remove(0, 13);
 | 
			
		||||
                                if (sbDic.Count == 1) sbSql.Remove(0, 15).Remove(sbSql.Length - 5, 5);
 | 
			
		||||
                                sbDic.Clear();
 | 
			
		||||
                                if (selectExp == null) subList = subSelect.ToListAfPrivate(sbSql.ToString(), af, null);
 | 
			
		||||
                                else subList = subSelect.ToListMrPrivate<TNavigate>(sbSql.ToString(), mf, null);
 | 
			
		||||
 | 
			
		||||
                                if (isAsync)
 | 
			
		||||
                                {
 | 
			
		||||
#if net40
 | 
			
		||||
#else
 | 
			
		||||
                                    if (selectExp == null) subList = await subSelect.ToListAfPrivateAsync(sbSql.ToString(), af, null);
 | 
			
		||||
                                    else subList = await subSelect.ToListMrPrivateAsync<TNavigate>(sbSql.ToString(), mf, null);
 | 
			
		||||
#endif
 | 
			
		||||
                                }
 | 
			
		||||
                                else
 | 
			
		||||
                                {
 | 
			
		||||
                                    if (selectExp == null) subList = subSelect.ToListAfPrivate(sbSql.ToString(), af, null);
 | 
			
		||||
                                    else subList = subSelect.ToListMrPrivate<TNavigate>(sbSql.ToString(), mf, null);
 | 
			
		||||
                                }
 | 
			
		||||
                                sbSql.Clear();
 | 
			
		||||
                            }
 | 
			
		||||
                            else
 | 
			
		||||
@@ -731,8 +750,20 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                                    sbDic.Clear();
 | 
			
		||||
                                }
 | 
			
		||||
                                subSelect.Where(oldWhere);
 | 
			
		||||
                                if (selectExp == null) subList = subSelect.ToList(true);
 | 
			
		||||
                                else subList = subSelect.ToList<TNavigate>(selectExp);
 | 
			
		||||
 | 
			
		||||
                                if (isAsync)
 | 
			
		||||
                                {
 | 
			
		||||
#if net40
 | 
			
		||||
#else
 | 
			
		||||
                                    if (selectExp == null) subList = await subSelect.ToListAsync(true);
 | 
			
		||||
                                    else subList = await subSelect.ToListAsync<TNavigate>(selectExp);
 | 
			
		||||
#endif
 | 
			
		||||
                                }
 | 
			
		||||
                                else
 | 
			
		||||
                                {
 | 
			
		||||
                                    if (selectExp == null) subList = subSelect.ToList(true);
 | 
			
		||||
                                    else subList = subSelect.ToList<TNavigate>(selectExp);
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            if (subList.Any() == false)
 | 
			
		||||
@@ -826,7 +857,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                            {
 | 
			
		||||
                                if (z > 0) sbJoin.Append(" AND ");
 | 
			
		||||
                                sbJoin.Append($"midtb.{_commonUtils.QuoteSqlName(tbref.MiddleColumns[tbref.Columns.Count + z].Attribute.Name)} = a.{_commonUtils.QuoteSqlName(tbref.RefColumns[z].Attribute.Name)}");
 | 
			
		||||
                                if (_whereCascadeExpression.Any()) {
 | 
			
		||||
                                if (_whereCascadeExpression.Any())
 | 
			
		||||
                                {
 | 
			
		||||
                                    var cascade = _commonExpression.GetWhereCascadeSql(new SelectTableInfo { Alias = "midtb", AliasInit = "midtb", Table = tbrefMid, Type = SelectTableInfoType.InnerJoin }, _whereCascadeExpression);
 | 
			
		||||
                                    if (string.IsNullOrEmpty(cascade) == false)
 | 
			
		||||
                                        sbJoin.Append(" AND (").Append(cascade).Append(")");
 | 
			
		||||
@@ -843,7 +875,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                            var sbSql = new StringBuilder();
 | 
			
		||||
 | 
			
		||||
                            if (_selectExpression == null)
 | 
			
		||||
                            {// return this.InternalToList<T1>(_selectExpression).Select(a => (a, ()).ToList();
 | 
			
		||||
                            {
 | 
			
		||||
                                var field = new StringBuilder();
 | 
			
		||||
                                var read = new ReadAnonymousTypeInfo();
 | 
			
		||||
                                read.ConsturctorType = ReadAnonymousTypeInfoConsturctorType.Properties;
 | 
			
		||||
@@ -919,8 +951,19 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                                sbSql.Append(subSelect.ToSql($"{(selectExp == null ? af.Field : mf.field)}{otherData?.field}"));
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            if (selectExp == null) subList = subSelect.ToListAfPrivate(sbSql.ToString(), af, otherData == null ? null : new[] { (otherData.Value.field, otherData.Value.read, midList) });
 | 
			
		||||
                            else subList = subSelect.ToListMrPrivate<TNavigate>(sbSql.ToString(), mf, otherData == null ? null : new[] { (otherData.Value.field, otherData.Value.read, midList) });
 | 
			
		||||
                            if (isAsync)
 | 
			
		||||
                            {
 | 
			
		||||
#if net40
 | 
			
		||||
#else
 | 
			
		||||
                                if (selectExp == null) subList = await subSelect.ToListAfPrivateAsync(sbSql.ToString(), af, otherData == null ? null : new[] { (otherData.Value.field, otherData.Value.read, midList) });
 | 
			
		||||
                                else subList = await subSelect.ToListMrPrivateAsync<TNavigate>(sbSql.ToString(), mf, otherData == null ? null : new[] { (otherData.Value.field, otherData.Value.read, midList) });
 | 
			
		||||
#endif
 | 
			
		||||
                            }
 | 
			
		||||
                            else
 | 
			
		||||
                            {
 | 
			
		||||
                                if (selectExp == null) subList = subSelect.ToListAfPrivate(sbSql.ToString(), af, otherData == null ? null : new[] { (otherData.Value.field, otherData.Value.read, midList) });
 | 
			
		||||
                                else subList = subSelect.ToListMrPrivate<TNavigate>(sbSql.ToString(), mf, otherData == null ? null : new[] { (otherData.Value.field, otherData.Value.read, midList) });
 | 
			
		||||
                            }
 | 
			
		||||
                            if (subList.Any() == false)
 | 
			
		||||
                            {
 | 
			
		||||
                                foreach (var item in list)
 | 
			
		||||
@@ -983,7 +1026,13 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                        }
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            _includeToList.Add(listObj => includeToListSyncOrAsync(listObj, false));
 | 
			
		||||
#if net40
 | 
			
		||||
#else
 | 
			
		||||
            _includeToListAsync.Add(listObj => includeToListSyncOrAsync(listObj, true));
 | 
			
		||||
#endif
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -995,6 +1044,12 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
 | 
			
		||||
#if net40
 | 
			
		||||
#else
 | 
			
		||||
        async internal Task SetListAsync(IEnumerable<T1> list)
 | 
			
		||||
        {
 | 
			
		||||
            foreach (var include in _includeToListAsync) await include?.Invoke(list);
 | 
			
		||||
            _trackToList?.Invoke(list);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Task<TMember> AvgAsync<TMember>(Expression<Func<T1, TMember>> column)
 | 
			
		||||
        {
 | 
			
		||||
            if (column == null) return Task.FromResult(default(TMember));
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user