mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 增加 IncludeMany 贪婪加载的时候可指定子表的字段,避免查询子表所有字段;
This commit is contained in:
		@@ -192,11 +192,12 @@ public static partial class FreeSqlGlobalExtensions
 | 
			
		||||
    /// 示例:new List<Song>(new[] { song1, song2, song3 }).IncludeMany(g.sqlite, a => a.Tags);<para></para>
 | 
			
		||||
    /// 文档:https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd#%E5%AF%BC%E8%88%AA%E5%B1%9E%E6%80%A7-onetomanymanytomany
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <typeparam name="T1"></typeparam>
 | 
			
		||||
    /// <typeparam name="TNavigate"></typeparam>
 | 
			
		||||
    /// <param name="list"></param>
 | 
			
		||||
    /// <param name="orm"></param>
 | 
			
		||||
    /// <param name="navigateSelector">选择一个集合的导航属性,也可通过 .Where 设置临时的关系映射,还可以 .Take(5) 每个子集合只取5条</param>
 | 
			
		||||
    /// <param name="navigateSelector">选择一个集合的导航属性,如: .IncludeMany(a => a.Tags)<para></para>
 | 
			
		||||
    /// 可以 .Where 设置临时的关系映射,如: .IncludeMany(a => a.Tags.Where(tag => tag.TypeId == a.Id))<para></para>
 | 
			
		||||
    /// 可以 .Take(5) 每个子集合只取5条,如: .IncludeMany(a => a.Tags.Take(5))<para></para>
 | 
			
		||||
    /// 可以 .Select 设置只查询部分字段,如: (a => new TNavigate { Title = a.Title }) 
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="then">即能 ThenInclude,还可以二次过滤(这个 EFCore 做不到?)</param>
 | 
			
		||||
    /// <returns></returns>
 | 
			
		||||
    public static List<T1> IncludeMany<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
 | 
			
		||||
 
 | 
			
		||||
@@ -1490,7 +1490,11 @@
 | 
			
		||||
            文档:https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd#%E5%AF%BC%E8%88%AA%E5%B1%9E%E6%80%A7-onetomanymanytomany
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="TNavigate"></typeparam>
 | 
			
		||||
            <param name="navigateSelector">选择一个集合的导航属性,也可通过 .Where 设置临时的关系映射,还可以 .Take(5) 每个子集合只取5条</param>
 | 
			
		||||
            <param name="navigateSelector">选择一个集合的导航属性,如: .IncludeMany(a => a.Tags)<para></para>
 | 
			
		||||
            可以 .Where 设置临时的关系映射,如: .IncludeMany(a => a.Tags.Where(tag => tag.TypeId == a.Id))<para></para>
 | 
			
		||||
            可以 .Take(5) 每个子集合只取5条,如: .IncludeMany(a => a.Tags.Take(5))<para></para>
 | 
			
		||||
            可以 .Select 设置只查询部分字段,如: (a => new TNavigate { Title = a.Title }) 
 | 
			
		||||
            </param>
 | 
			
		||||
            <param name="then">即能 ThenInclude,还可以二次过滤(这个 EFCore 做不到?)</param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
@@ -1996,137 +2000,6 @@
 | 
			
		||||
            <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>
 | 
			
		||||
            可自定义解析表达式
 | 
			
		||||
@@ -2657,11 +2530,12 @@
 | 
			
		||||
            示例:new List<Song>(new[] { song1, song2, song3 }).IncludeMany(g.sqlite, a => a.Tags);<para></para>
 | 
			
		||||
            文档:https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd#%E5%AF%BC%E8%88%AA%E5%B1%9E%E6%80%A7-onetomanymanytomany
 | 
			
		||||
            </summary>
 | 
			
		||||
            <typeparam name="T1"></typeparam>
 | 
			
		||||
            <typeparam name="TNavigate"></typeparam>
 | 
			
		||||
            <param name="list"></param>
 | 
			
		||||
            <param name="orm"></param>
 | 
			
		||||
            <param name="navigateSelector">选择一个集合的导航属性,也可通过 .Where 设置临时的关系映射,还可以 .Take(5) 每个子集合只取5条</param>
 | 
			
		||||
            <param name="navigateSelector">选择一个集合的导航属性,如: .IncludeMany(a => a.Tags)<para></para>
 | 
			
		||||
            可以 .Where 设置临时的关系映射,如: .IncludeMany(a => a.Tags.Where(tag => tag.TypeId == a.Id))<para></para>
 | 
			
		||||
            可以 .Take(5) 每个子集合只取5条,如: .IncludeMany(a => a.Tags.Take(5))<para></para>
 | 
			
		||||
            可以 .Select 设置只查询部分字段,如: (a => new TNavigate { Title = a.Title }) 
 | 
			
		||||
            </param>
 | 
			
		||||
            <param name="then">即能 ThenInclude,还可以二次过滤(这个 EFCore 做不到?)</param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
@@ -2836,3 +2710,159 @@
 | 
			
		||||
        </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>
 | 
			
		||||
 
 | 
			
		||||
@@ -359,7 +359,11 @@ namespace FreeSql
 | 
			
		||||
        /// 文档:https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd#%E5%AF%BC%E8%88%AA%E5%B1%9E%E6%80%A7-onetomanymanytomany
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <typeparam name="TNavigate"></typeparam>
 | 
			
		||||
        /// <param name="navigateSelector">选择一个集合的导航属性,也可通过 .Where 设置临时的关系映射,还可以 .Take(5) 每个子集合只取5条</param>
 | 
			
		||||
        /// <param name="navigateSelector">选择一个集合的导航属性,如: .IncludeMany(a => a.Tags)<para></para>
 | 
			
		||||
        /// 可以 .Where 设置临时的关系映射,如: .IncludeMany(a => a.Tags.Where(tag => tag.TypeId == a.Id))<para></para>
 | 
			
		||||
        /// 可以 .Take(5) 每个子集合只取5条,如: .IncludeMany(a => a.Tags.Take(5))<para></para>
 | 
			
		||||
        /// 可以 .Select 设置只查询部分字段,如: (a => new TNavigate { Title = a.Title }) 
 | 
			
		||||
        /// </param>
 | 
			
		||||
        /// <param name="then">即能 ThenInclude,还可以二次过滤(这个 EFCore 做不到?)</param>
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        ISelect<T1> IncludeMany<TNavigate>(Expression<Func<T1, IEnumerable<TNavigate>>> navigateSelector, Action<ISelect<TNavigate>> then = null) where TNavigate : class;
 | 
			
		||||
 
 | 
			
		||||
@@ -108,31 +108,34 @@ namespace FreeSql.Internal
 | 
			
		||||
                    parent.Consturctor = initExp.NewExpression.Type.GetConstructors()[0];
 | 
			
		||||
                    parent.ConsturctorType = ReadAnonymousTypeInfoConsturctorType.Properties;
 | 
			
		||||
 | 
			
		||||
                    //dto 映射
 | 
			
		||||
                    var dtoProps = initExp.NewExpression.Type.GetPropertiesDictIgnoreCase().Values;
 | 
			
		||||
                    foreach (var dtoProp in dtoProps)
 | 
			
		||||
                    if (initExp.NewExpression.Type != _tables.FirstOrDefault()?.Table.Type)
 | 
			
		||||
                    {
 | 
			
		||||
                        foreach (var dtTb in _tables)
 | 
			
		||||
                        //dto 映射
 | 
			
		||||
                        var dtoProps = initExp.NewExpression.Type.GetPropertiesDictIgnoreCase().Values;
 | 
			
		||||
                        foreach (var dtoProp in dtoProps)
 | 
			
		||||
                        {
 | 
			
		||||
                            if (dtTb.Table.Columns.TryGetValue(dtoProp.Name, out var trydtocol))
 | 
			
		||||
                            foreach (var dtTb in _tables)
 | 
			
		||||
                            {
 | 
			
		||||
                                var child = new ReadAnonymousTypeInfo
 | 
			
		||||
                                if (dtTb.Table.Columns.TryGetValue(dtoProp.Name, out var trydtocol))
 | 
			
		||||
                                {
 | 
			
		||||
                                    Property = dtoProp,
 | 
			
		||||
                                    CsName = dtoProp.Name,
 | 
			
		||||
                                    CsType = dtoProp.PropertyType,
 | 
			
		||||
                                    MapType = trydtocol.Attribute.MapType
 | 
			
		||||
                                };
 | 
			
		||||
                                parent.Childs.Add(child);
 | 
			
		||||
                                if (dtTb.Parameter != null)
 | 
			
		||||
                                    ReadAnonymousField(_tables, field, child, ref index, Expression.Property(dtTb.Parameter, dtTb.Table.Properties[trydtocol.CsName]), getSelectGroupingMapString, whereCascadeExpression);
 | 
			
		||||
                                else
 | 
			
		||||
                                {
 | 
			
		||||
                                    child.DbField = $"{dtTb.Alias}.{_common.QuoteSqlName(trydtocol.Attribute.Name)}";
 | 
			
		||||
                                    field.Append(", ").Append(child.DbField);
 | 
			
		||||
                                    if (index >= 0) field.Append(" as").Append(++index);
 | 
			
		||||
                                    var child = new ReadAnonymousTypeInfo
 | 
			
		||||
                                    {
 | 
			
		||||
                                        Property = dtoProp,
 | 
			
		||||
                                        CsName = dtoProp.Name,
 | 
			
		||||
                                        CsType = dtoProp.PropertyType,
 | 
			
		||||
                                        MapType = trydtocol.Attribute.MapType
 | 
			
		||||
                                    };
 | 
			
		||||
                                    parent.Childs.Add(child);
 | 
			
		||||
                                    if (dtTb.Parameter != null)
 | 
			
		||||
                                        ReadAnonymousField(_tables, field, child, ref index, Expression.Property(dtTb.Parameter, dtTb.Table.Properties[trydtocol.CsName]), getSelectGroupingMapString, whereCascadeExpression);
 | 
			
		||||
                                    else
 | 
			
		||||
                                    {
 | 
			
		||||
                                        child.DbField = $"{dtTb.Alias}.{_common.QuoteSqlName(trydtocol.Attribute.Name)}";
 | 
			
		||||
                                        field.Append(", ").Append(child.DbField);
 | 
			
		||||
                                        if (index >= 0) field.Append(" as").Append(++index);
 | 
			
		||||
                                    }
 | 
			
		||||
                                    break;
 | 
			
		||||
                                }
 | 
			
		||||
                                break;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 
 | 
			
		||||
@@ -462,9 +462,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
 | 
			
		||||
        public T1 First() => this.ToOne();
 | 
			
		||||
 | 
			
		||||
        protected List<TReturn> ToListMapReader<TReturn>((ReadAnonymousTypeInfo map, string field) af)
 | 
			
		||||
        internal List<TReturn> ToListMrPrivate<TReturn>(string sql, (ReadAnonymousTypeInfo map, string field) af, (string field, ReadAnonymousTypeInfo read, List<object> retlist)[] otherData)
 | 
			
		||||
        {
 | 
			
		||||
            var sql = this.ToSql(af.field);
 | 
			
		||||
            var type = typeof(TReturn);
 | 
			
		||||
            var dbParms = _params.ToArray();
 | 
			
		||||
            var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms);
 | 
			
		||||
@@ -477,6 +476,9 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                {
 | 
			
		||||
                    var index = -1;
 | 
			
		||||
                    ret.Add((TReturn)_commonExpression.ReadAnonymous(af.map, dr, ref index, false));
 | 
			
		||||
                    if (otherData != null)
 | 
			
		||||
                        foreach (var other in otherData)
 | 
			
		||||
                            other.retlist.Add(_commonExpression.ReadAnonymous(other.read, dr, ref index, false));
 | 
			
		||||
                }, CommandType.Text, sql, dbParms);
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
@@ -489,9 +491,27 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                var after = new Aop.CurdAfterEventArgs(before, exception, ret);
 | 
			
		||||
                _orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
            }
 | 
			
		||||
            if (typeof(TReturn) == typeof(T1))
 | 
			
		||||
                foreach (var include in _includeToList) include?.Invoke(ret);
 | 
			
		||||
            _trackToList?.Invoke(ret);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
        internal List<TReturn> ToListMapReaderPrivate<TReturn>((ReadAnonymousTypeInfo map, string field) af, (string field, ReadAnonymousTypeInfo read, List<object> retlist)[] otherData)
 | 
			
		||||
        {
 | 
			
		||||
            string sql = null;
 | 
			
		||||
            if (otherData?.Length > 0)
 | 
			
		||||
            {
 | 
			
		||||
                var sbField = new StringBuilder().Append(af.field);
 | 
			
		||||
                foreach (var other in otherData)
 | 
			
		||||
                    sbField.Append(other.field);
 | 
			
		||||
                sql = this.ToSql(sbField.ToString());
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
                sql = this.ToSql(af.field);
 | 
			
		||||
 | 
			
		||||
            return ToListMrPrivate<TReturn>(sql, af, otherData);
 | 
			
		||||
        }
 | 
			
		||||
        protected List<TReturn> ToListMapReader<TReturn>((ReadAnonymousTypeInfo map, string field) af) => ToListMapReaderPrivate<TReturn>(af, null);
 | 
			
		||||
        protected (ReadAnonymousTypeInfo map, string field) GetExpressionField(Expression newexp)
 | 
			
		||||
        {
 | 
			
		||||
            var map = new ReadAnonymousTypeInfo();
 | 
			
		||||
@@ -1163,9 +1183,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
 | 
			
		||||
        public Task<T1> FirstAsync() => this.ToOneAsync();
 | 
			
		||||
 | 
			
		||||
        async protected Task<List<TReturn>> ToListMapReaderAsync<TReturn>((ReadAnonymousTypeInfo map, string field) af)
 | 
			
		||||
        async internal Task<List<TReturn>> ToListMrPrivateAsync<TReturn>(string sql, (ReadAnonymousTypeInfo map, string field) af, (string field, ReadAnonymousTypeInfo read, List<object> retlist)[] otherData)
 | 
			
		||||
        {
 | 
			
		||||
            var sql = this.ToSql(af.field);
 | 
			
		||||
            var type = typeof(TReturn);
 | 
			
		||||
            var dbParms = _params.ToArray();
 | 
			
		||||
            var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms);
 | 
			
		||||
@@ -1178,6 +1197,9 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                {
 | 
			
		||||
                    var index = -1;
 | 
			
		||||
                    ret.Add((TReturn)_commonExpression.ReadAnonymous(af.map, dr, ref index, false));
 | 
			
		||||
                    if (otherData != null)
 | 
			
		||||
                        foreach (var other in otherData)
 | 
			
		||||
                            other.retlist.Add(_commonExpression.ReadAnonymous(other.read, dr, ref index, false));
 | 
			
		||||
                    return Task.FromResult(false);
 | 
			
		||||
                }, CommandType.Text, sql, dbParms);
 | 
			
		||||
            }
 | 
			
		||||
@@ -1191,9 +1213,27 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                var after = new Aop.CurdAfterEventArgs(before, exception, ret);
 | 
			
		||||
                _orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
            }
 | 
			
		||||
            if (typeof(TReturn) == typeof(T1))
 | 
			
		||||
                foreach (var include in _includeToList) include?.Invoke(ret);
 | 
			
		||||
            _trackToList?.Invoke(ret);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
        internal Task<List<TReturn>> ToListMapReaderPrivateAsync<TReturn>((ReadAnonymousTypeInfo map, string field) af, (string field, ReadAnonymousTypeInfo read, List<object> retlist)[] otherData)
 | 
			
		||||
        {
 | 
			
		||||
            string sql = null;
 | 
			
		||||
            if (otherData?.Length > 0)
 | 
			
		||||
            {
 | 
			
		||||
                var sbField = new StringBuilder().Append(af.field);
 | 
			
		||||
                foreach (var other in otherData)
 | 
			
		||||
                    sbField.Append(other.field);
 | 
			
		||||
                sql = this.ToSql(sbField.ToString());
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
                sql = this.ToSql(af.field);
 | 
			
		||||
 | 
			
		||||
            return ToListMrPrivateAsync<TReturn>(sql, af, otherData);
 | 
			
		||||
        }
 | 
			
		||||
        protected Task<List<TReturn>> ToListMapReaderAsync<TReturn>((ReadAnonymousTypeInfo map, string field) af) => ToListMapReaderPrivateAsync<TReturn>(af, null);
 | 
			
		||||
 | 
			
		||||
        async protected Task<TMember> InternalAvgAsync<TMember>(Expression exp) => (await this.ToListAsync<TMember>($"avg({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})")).FirstOrDefault();
 | 
			
		||||
        async protected Task<TMember> InternalMaxAsync<TMember>(Expression exp) => (await this.ToListAsync<TMember>($"max({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})")).FirstOrDefault();
 | 
			
		||||
 
 | 
			
		||||
@@ -386,16 +386,23 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
            if (expBody == null) return this;
 | 
			
		||||
            MethodCallExpression whereExp = null;
 | 
			
		||||
            int takeNumber = 0;
 | 
			
		||||
            Expression<Func<TNavigate, TNavigate>> selectExp = null;
 | 
			
		||||
            while (expBody.NodeType == ExpressionType.Call)
 | 
			
		||||
            {
 | 
			
		||||
                throwNavigateSelector = new Exception($"IncludeMany {nameof(navigateSelector)} 参数类型错误,表达式格式应该是 a.collections.Take(1).Where(c => c.aid == a.id)");
 | 
			
		||||
                throwNavigateSelector = new Exception($"IncludeMany {nameof(navigateSelector)} 参数类型错误,正确格式: a.collections.Take(1).Where(c => c.aid == a.id).Select(a => new TNavigate {{ }})");
 | 
			
		||||
                var callExp = (expBody as MethodCallExpression);
 | 
			
		||||
                switch (callExp.Method.Name)
 | 
			
		||||
                {
 | 
			
		||||
                    case "Where":
 | 
			
		||||
                        whereExp = callExp;
 | 
			
		||||
                        break;
 | 
			
		||||
                    case "Take": takeNumber = int.Parse((callExp.Arguments[1] as ConstantExpression)?.Value?.ToString() ?? "0"); break;
 | 
			
		||||
                    case "Take":
 | 
			
		||||
                        takeNumber = int.Parse(_commonExpression.ExpressionLambdaToSql(callExp.Arguments[1], new CommonExpression.ExpTSC { }));
 | 
			
		||||
                        break;
 | 
			
		||||
                    case "Select":
 | 
			
		||||
                        selectExp = (callExp.Arguments[1] as Expression<Func<TNavigate, TNavigate>>);
 | 
			
		||||
                        if (selectExp?.Parameters.Count != 1) throw new Exception($"IncludeMany {nameof(navigateSelector)} 参数错误,Select 只可以使用一个参数的方法,正确格式: .Select(t => new TNavigate {{ }})");
 | 
			
		||||
                        break;
 | 
			
		||||
                    default: throw throwNavigateSelector;
 | 
			
		||||
                }
 | 
			
		||||
                expBody = callExp.Object ?? callExp.Arguments.FirstOrDefault();
 | 
			
		||||
@@ -406,6 +413,9 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
            var (membersParam, members) = GetExpressionStack(collMem.Expression);
 | 
			
		||||
            var tb = _commonUtils.GetTableByEntity(collMem.Expression.Type);
 | 
			
		||||
            if (tb == null) throw throwNavigateSelector;
 | 
			
		||||
            var collMemElementType = (collMem.Type.IsGenericType ? collMem.Type.GetGenericArguments().FirstOrDefault() : collMem.Type.GetElementType());
 | 
			
		||||
            if (typeof(TNavigate) != collMemElementType) 
 | 
			
		||||
                throw new Exception($"IncludeMany {nameof(navigateSelector)} 参数错误,Select lambda参数返回值必须和 {collMemElementType} 类型一致");
 | 
			
		||||
            var tbNav = _commonUtils.GetTableByEntity(typeof(TNavigate));
 | 
			
		||||
            if (tbNav == null) throw new Exception($"类型 {typeof(TNavigate).FullName} 错误,不能使用 IncludeMany");
 | 
			
		||||
 | 
			
		||||
@@ -588,6 +598,22 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                var oldWhere = subSelect._where.ToString();
 | 
			
		||||
                if (oldWhere.StartsWith(" AND ")) oldWhere = oldWhere.Remove(0, 5);
 | 
			
		||||
 | 
			
		||||
                if (selectExp != null)
 | 
			
		||||
                {
 | 
			
		||||
                    var tmpinitExp = selectExp.Body as MemberInitExpression;
 | 
			
		||||
                    var newinitExpBindings = tmpinitExp.Bindings.ToList();
 | 
			
		||||
                    foreach (var tbrefCol in tbref.RefColumns)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (newinitExpBindings.Any(a => a.Member.Name == tbrefCol.CsName)) continue;
 | 
			
		||||
                        var tmpMemberInfo = tbrefCol.Table.Properties[tbrefCol.CsName];
 | 
			
		||||
                        newinitExpBindings.Add(Expression.Bind(tmpMemberInfo, Expression.MakeMemberAccess(selectExp.Parameters[0], tmpMemberInfo)));
 | 
			
		||||
                    }
 | 
			
		||||
                    Expression newinitExp = Expression.MemberInit(tmpinitExp.NewExpression, newinitExpBindings.ToList());
 | 
			
		||||
                    var selectExpParam = subSelect._tables[0].Parameter ?? Expression.Parameter(typeof(TNavigate), subSelectT1Alias);
 | 
			
		||||
                    newinitExp = new NewExpressionVisitor(selectExpParam, selectExp.Parameters[0]).Replace(newinitExp);
 | 
			
		||||
                    selectExp = Expression.Lambda<Func<TNavigate, TNavigate>>(newinitExp, selectExpParam);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                switch (tbref.RefType)
 | 
			
		||||
                {
 | 
			
		||||
                    case TableRefType.OneToMany:
 | 
			
		||||
@@ -616,19 +642,23 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                            };
 | 
			
		||||
                            if (takeNumber > 0)
 | 
			
		||||
                            {
 | 
			
		||||
                                var af = subSelect.GetAllFieldExpressionTreeLevelAll();
 | 
			
		||||
                                Select0Provider<ISelect<TNavigate>, TNavigate>.GetAllFieldExpressionTreeInfo af = null;
 | 
			
		||||
                                (ReadAnonymousTypeInfo map, string field) mf = default;
 | 
			
		||||
                                if (selectExp == null) af = subSelect.GetAllFieldExpressionTreeLevelAll();
 | 
			
		||||
                                else mf = subSelect.GetExpressionField(selectExp);
 | 
			
		||||
                                var sbSql = new StringBuilder();
 | 
			
		||||
                                var sbDic = getWhereDic();
 | 
			
		||||
                                foreach (var sbd in sbDic)
 | 
			
		||||
                                {
 | 
			
		||||
                                    subSelect._where.Clear();
 | 
			
		||||
                                    subSelect.Where(sbd.Key).Where(oldWhere).Limit(takeNumber);
 | 
			
		||||
                                    sbSql.Append("\r\nUNION ALL\r\nselect * from (").Append(subSelect.ToSql(af.Field)).Append(") ftb");
 | 
			
		||||
                                    sbSql.Append("\r\nUNION ALL\r\nselect * from (").Append(subSelect.ToSql(selectExp == null ? af.Field : mf.field)).Append(") ftb");
 | 
			
		||||
                                }
 | 
			
		||||
                                sbSql.Remove(0, 13);
 | 
			
		||||
                                if (sbDic.Count == 1) sbSql.Remove(0, 15).Remove(sbSql.Length - 5, 5);
 | 
			
		||||
                                sbDic.Clear();
 | 
			
		||||
                                subList = subSelect.ToListAfPrivate(sbSql.ToString(), af, null);
 | 
			
		||||
                                if (selectExp == null) subList = subSelect.ToListAfPrivate(sbSql.ToString(), af, null);
 | 
			
		||||
                                else subList = subSelect.ToListMrPrivate<TNavigate>(sbSql.ToString(), mf, null);
 | 
			
		||||
                                sbSql.Clear();
 | 
			
		||||
                            }
 | 
			
		||||
                            else
 | 
			
		||||
@@ -658,7 +688,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                                    sbDic.Clear();
 | 
			
		||||
                                }
 | 
			
		||||
                                subSelect.Where(oldWhere);
 | 
			
		||||
                                subList = subSelect.ToList(true);
 | 
			
		||||
                                if (selectExp == null) subList = subSelect.ToList(true);
 | 
			
		||||
                                else subList = subSelect.ToList<TNavigate>(selectExp);
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            if (subList.Any() == false)
 | 
			
		||||
@@ -760,7 +791,10 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                            subSelect.InnerJoin(sbJoin.ToString());
 | 
			
		||||
                            sbJoin.Clear();
 | 
			
		||||
 | 
			
		||||
                            var af = subSelect.GetAllFieldExpressionTreeLevelAll();
 | 
			
		||||
                            Select0Provider<ISelect<TNavigate>, TNavigate>.GetAllFieldExpressionTreeInfo af = null;
 | 
			
		||||
                            (ReadAnonymousTypeInfo map, string field) mf = default;
 | 
			
		||||
                            if (selectExp == null) af = subSelect.GetAllFieldExpressionTreeLevelAll();
 | 
			
		||||
                            else mf = subSelect.GetExpressionField(selectExp);
 | 
			
		||||
                            (string field, ReadAnonymousTypeInfo read)? otherData = null;
 | 
			
		||||
                            var sbSql = new StringBuilder();
 | 
			
		||||
 | 
			
		||||
@@ -814,7 +848,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                                {
 | 
			
		||||
                                    subSelect._where.Clear();
 | 
			
		||||
                                    subSelect.Where(sbd.Key).Where(oldWhere).Limit(takeNumber);
 | 
			
		||||
                                    sbSql.Append("\r\nUNION ALL\r\nselect * from (").Append(subSelect.ToSql($"{af.Field}{otherData?.field}")).Append(") ftb");
 | 
			
		||||
                                    sbSql.Append("\r\nUNION ALL\r\nselect * from (").Append(subSelect.ToSql($"{(selectExp == null ? af.Field : mf.field)}{otherData?.field}")).Append(") ftb");
 | 
			
		||||
                                }
 | 
			
		||||
                                sbSql.Remove(0, 13);
 | 
			
		||||
                                if (sbDic.Count == 1) sbSql.Remove(0, 15).Remove(sbSql.Length - 5, 5);
 | 
			
		||||
@@ -838,10 +872,11 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                                    sbDic.Clear();
 | 
			
		||||
                                }
 | 
			
		||||
                                subSelect.Where(oldWhere);
 | 
			
		||||
                                sbSql.Append(subSelect.ToSql($"{af.Field}{otherData?.field}"));
 | 
			
		||||
                                sbSql.Append(subSelect.ToSql($"{(selectExp == null ? af.Field : mf.field)}{otherData?.field}"));
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            subList = subSelect.ToListAfPrivate(sbSql.ToString(), af, otherData == null ? null : new[] { (otherData.Value.field, otherData.Value.read, midList) });
 | 
			
		||||
                            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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user