mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	- 优化 IncludeByPropertyName + AsType;
This commit is contained in:
		@@ -800,5 +800,14 @@
 | 
				
			|||||||
            <param name="that"></param>
 | 
					            <param name="that"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            批量注入 Repository,可以参考代码自行调整
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="services"></param>
 | 
				
			||||||
 | 
					            <param name="globalDataFilter"></param>
 | 
				
			||||||
 | 
					            <param name="assemblies"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
    </members>
 | 
					    </members>
 | 
				
			||||||
</doc>
 | 
					</doc>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1569,6 +1569,84 @@ WHERE (((cast(a.[Id] as nvarchar(100))) in (SELECT TOP 10 b.[Title]
 | 
				
			|||||||
                .IncludeByPropertyName("Songs")
 | 
					                .IncludeByPropertyName("Songs")
 | 
				
			||||||
                .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
 | 
					                .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
 | 
				
			||||||
                .ToList();
 | 
					                .ToList();
 | 
				
			||||||
 | 
					            var tags3339 = g.sqlserver.Select<Tag>()
 | 
				
			||||||
 | 
					                .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
 | 
				
			||||||
 | 
					                .ToList();
 | 
				
			||||||
 | 
					            tags3339
 | 
				
			||||||
 | 
					                .IncludeByPropertyName(g.sqlserver, "Tags",
 | 
				
			||||||
 | 
					                    then: then => then.IncludeByPropertyName("Parent").IncludeByPropertyName("Songs").IncludeByPropertyName("Tags"))
 | 
				
			||||||
 | 
					                .IncludeByPropertyName(g.sqlserver, "Parent")
 | 
				
			||||||
 | 
					                .IncludeByPropertyName(g.sqlserver, "Songs");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var tags33331 = g.sqlserver.Select<object>()
 | 
				
			||||||
 | 
					                .AsType(typeof(Tag))
 | 
				
			||||||
 | 
					                .IncludeByPropertyName("Tags")
 | 
				
			||||||
 | 
					                .Where(a => (a as Tag).Id == tag1.Id || (a as Tag).Id == tag2.Id)
 | 
				
			||||||
 | 
					                .ToList();
 | 
				
			||||||
 | 
					            var tags333319 = g.sqlserver.Select<object>()
 | 
				
			||||||
 | 
					                .AsType(typeof(Tag))
 | 
				
			||||||
 | 
					                .Where(a => (a as Tag).Id == tag1.Id || (a as Tag).Id == tag2.Id)
 | 
				
			||||||
 | 
					                .ToList();
 | 
				
			||||||
 | 
					            tags333319.IncludeByPropertyName(g.sqlserver, "Tags");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var tags3333 = g.sqlserver.Select<object>()
 | 
				
			||||||
 | 
					                .AsType(typeof(Tag))
 | 
				
			||||||
 | 
					                .IncludeByPropertyName("Tags",
 | 
				
			||||||
 | 
					                    then => then.IncludeByPropertyName("Parent").IncludeByPropertyName("Songs").IncludeByPropertyName("Tags"))
 | 
				
			||||||
 | 
					                .IncludeByPropertyName("Parent")
 | 
				
			||||||
 | 
					                .IncludeByPropertyName("Songs")
 | 
				
			||||||
 | 
					                .Where(a => (a as Tag).Id == tag1.Id || (a as Tag).Id == tag2.Id)
 | 
				
			||||||
 | 
					                .ToList();
 | 
				
			||||||
 | 
					            var tags33339 = g.sqlserver.Select<object>()
 | 
				
			||||||
 | 
					                .AsType(typeof(Tag))
 | 
				
			||||||
 | 
					                .Where(a => (a as Tag).Id == tag1.Id || (a as Tag).Id == tag2.Id)
 | 
				
			||||||
 | 
					                .ToList();
 | 
				
			||||||
 | 
					            tags33339
 | 
				
			||||||
 | 
					                .IncludeByPropertyName(g.sqlserver, "Tags",
 | 
				
			||||||
 | 
					                    then: then => then.IncludeByPropertyName("Parent").IncludeByPropertyName("Songs").IncludeByPropertyName("Tags"))
 | 
				
			||||||
 | 
					                .IncludeByPropertyName(g.sqlserver, "Parent")
 | 
				
			||||||
 | 
					                .IncludeByPropertyName(g.sqlserver, "Songs");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var tags33333 = g.sqlserver.Select<object>()
 | 
				
			||||||
 | 
					                .AsType(typeof(Tag))
 | 
				
			||||||
 | 
					                .IncludeByPropertyName("Parent.Tags",
 | 
				
			||||||
 | 
					                    then => then.IncludeByPropertyName("Parent").IncludeByPropertyName("Songs").IncludeByPropertyName("Tags"))
 | 
				
			||||||
 | 
					                .IncludeByPropertyName("Songs")
 | 
				
			||||||
 | 
					                .Where(a => (a as Tag).Id == tag1_1.Id || (a as Tag).Id == tag1_1.Id)
 | 
				
			||||||
 | 
					                .ToList();
 | 
				
			||||||
 | 
					            var tags333339 = g.sqlserver.Select<object>()
 | 
				
			||||||
 | 
					                .AsType(typeof(Tag))
 | 
				
			||||||
 | 
					                .Where(a => (a as Tag).Id == tag1_1.Id || (a as Tag).Id == tag1_1.Id)
 | 
				
			||||||
 | 
					                .ToList();
 | 
				
			||||||
 | 
					            tags333339
 | 
				
			||||||
 | 
					                .IncludeByPropertyName(g.sqlserver, "Parent.Tags",
 | 
				
			||||||
 | 
					                    then: then => then.IncludeByPropertyName("Parent").IncludeByPropertyName("Songs").IncludeByPropertyName("Tags"))
 | 
				
			||||||
 | 
					                .IncludeByPropertyName(g.sqlserver, "Songs");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var tags333333 = g.sqlserver.Select<object>()
 | 
				
			||||||
 | 
					                .AsType(typeof(Tag))
 | 
				
			||||||
 | 
					                .IncludeByPropertyName("Parent.Tags",
 | 
				
			||||||
 | 
					                    then => then.IncludeByPropertyName("Parent").IncludeByPropertyName("Songs").IncludeByPropertyName("Tags"))
 | 
				
			||||||
 | 
					                .IncludeByPropertyName("Songs")
 | 
				
			||||||
 | 
					                .Where(a => (a as Tag).Id == tag1.Id || (a as Tag).Id == tag2.Id)
 | 
				
			||||||
 | 
					                .ToList();
 | 
				
			||||||
 | 
					            var tags3333339 = g.sqlserver.Select<object>()
 | 
				
			||||||
 | 
					                .AsType(typeof(Tag))
 | 
				
			||||||
 | 
					                .Where(a => (a as Tag).Id == tag1.Id || (a as Tag).Id == tag2.Id)
 | 
				
			||||||
 | 
					                .ToList();
 | 
				
			||||||
 | 
					            tags3333339
 | 
				
			||||||
 | 
					                .IncludeByPropertyName(g.sqlserver, "Parent.Tags",
 | 
				
			||||||
 | 
					                    select: "Id, Name",
 | 
				
			||||||
 | 
					                    then: then => then.IncludeByPropertyName("Parent").IncludeByPropertyName("Songs").IncludeByPropertyName("Tags"))
 | 
				
			||||||
 | 
					                .IncludeByPropertyName(g.sqlserver, "Songs");
 | 
				
			||||||
 | 
					            var tags33333391 = g.sqlserver.Select<object>()
 | 
				
			||||||
 | 
					                .AsType(typeof(Tag))
 | 
				
			||||||
 | 
					                .Where(a => (a as Tag).Id == tag1_1.Id || (a as Tag).Id == tag2_1.Id)
 | 
				
			||||||
 | 
					                .ToList();
 | 
				
			||||||
 | 
					            tags33333391
 | 
				
			||||||
 | 
					                .IncludeByPropertyName(g.sqlserver, "Parent.Tags",
 | 
				
			||||||
 | 
					                    select: "Id, Name")
 | 
				
			||||||
 | 
					                .IncludeByPropertyName(g.sqlserver, "Songs");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var tags11 = g.sqlserver.Select<Tag>()
 | 
					            var tags11 = g.sqlserver.Select<Tag>()
 | 
				
			||||||
                .IncludeMany(a => a.Tags.Take(1))
 | 
					                .IncludeMany(a => a.Tags.Take(1))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -378,15 +378,16 @@ public static partial class FreeSqlGlobalExtensions
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
        IncludeByPropertyNameSyncOrAsync<T1>(bool isAsync, List<T1> list, IFreeSql orm, string property, string where, int take, string select, Expression<Action<ISelect<object>>> then) where T1 : class
 | 
					        IncludeByPropertyNameSyncOrAsync<T1>(bool isAsync, List<T1> list, IFreeSql orm, string property, string where, int take, string select, Expression<Action<ISelect<object>>> then) where T1 : class
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        if (list?.Any() != true) return list;
 | 
				
			||||||
 | 
					        var entityType = typeof(T1) == typeof(object) ? list[0].GetType() : typeof(T1);
 | 
				
			||||||
 | 
					        var t1tb = orm.CodeFirst.GetTableByEntity(entityType);
 | 
				
			||||||
        if (orm.CodeFirst.IsAutoSyncStructure)
 | 
					        if (orm.CodeFirst.IsAutoSyncStructure)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var tb = orm.CodeFirst.GetTableByEntity(typeof(T1));
 | 
					            if (t1tb == null || t1tb.Primarys.Any() == false)
 | 
				
			||||||
            if (tb == null || tb.Primarys.Any() == false)
 | 
					                (orm.CodeFirst as CodeFirstProvider)._dicSycedTryAdd(entityType); //._dicSyced.TryAdd(typeof(TReturn), true);
 | 
				
			||||||
                (orm.CodeFirst as CodeFirstProvider)._dicSycedTryAdd(typeof(T1)); //._dicSyced.TryAdd(typeof(TReturn), true);
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        var props = property.Split('.');
 | 
					        var props = property.Split('.');
 | 
				
			||||||
        var t1tb = orm.CodeFirst.GetTableByEntity(typeof(T1));
 | 
					        var t1sel = orm.Select<object>().AsType(entityType) as Select1Provider<object>;
 | 
				
			||||||
        var t1sel = orm.Select<T1>() as Select1Provider<T1>;
 | 
					 | 
				
			||||||
        var t1expFul = t1sel.ConvertStringPropertyToExpression(property, true);
 | 
					        var t1expFul = t1sel.ConvertStringPropertyToExpression(property, true);
 | 
				
			||||||
        var t1exp = props.Length == 1 ? t1expFul : t1sel.ConvertStringPropertyToExpression(props[0], true);
 | 
					        var t1exp = props.Length == 1 ? t1expFul : t1sel.ConvertStringPropertyToExpression(props[0], true);
 | 
				
			||||||
        if (t1expFul == null) throw new ArgumentException(CoreStrings.Cannot_Resolve_ExpressionTree(nameof(property)));
 | 
					        if (t1expFul == null) throw new ArgumentException(CoreStrings.Cannot_Resolve_ExpressionTree(nameof(property)));
 | 
				
			||||||
@@ -395,7 +396,7 @@ public static partial class FreeSqlGlobalExtensions
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            if (props.Length > 1)
 | 
					            if (props.Length > 1)
 | 
				
			||||||
                IncludeByPropertyName(list, orm, string.Join(".", props.Take(props.Length - 1)));
 | 
					                IncludeByPropertyName(list, orm, string.Join(".", props.Take(props.Length - 1)));
 | 
				
			||||||
            var imsel = IncludeManyByPropertyNameCommonGetSelect<T1>(orm, property, where, take, select, then);
 | 
					            var imsel = IncludeManyByPropertyNameCommonGetSelect(orm, entityType, property, where, take, select, then);
 | 
				
			||||||
#if net40
 | 
					#if net40
 | 
				
			||||||
            imsel.SetList(list);
 | 
					            imsel.SetList(list);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
@@ -409,10 +410,8 @@ public static partial class FreeSqlGlobalExtensions
 | 
				
			|||||||
        var reftb = orm.CodeFirst.GetTableByEntity(t1exp.Type);
 | 
					        var reftb = orm.CodeFirst.GetTableByEntity(t1exp.Type);
 | 
				
			||||||
        var refsel = orm.Select<object>().AsType(t1exp.Type) as Select1Provider<object>;
 | 
					        var refsel = orm.Select<object>().AsType(t1exp.Type) as Select1Provider<object>;
 | 
				
			||||||
        if (props.Length > 1)
 | 
					        if (props.Length > 1)
 | 
				
			||||||
        {
 | 
					            refsel.IncludeByPropertyName(string.Join(".", props.Skip(1)));
 | 
				
			||||||
            var refexp = refsel.ConvertStringPropertyToExpression(string.Join(".", props.Skip(1)), true);
 | 
					
 | 
				
			||||||
            refsel.Include(Expression.Lambda<Func<object, object>>(refexp, refsel._tables[0].Parameter));
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        var listdic = list.Select(item =>
 | 
					        var listdic = list.Select(item =>
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var refitem = t1exp.Type.CreateInstanceGetDefaultValue();
 | 
					            var refitem = t1exp.Type.CreateInstanceGetDefaultValue();
 | 
				
			||||||
@@ -444,15 +443,15 @@ public static partial class FreeSqlGlobalExtensions
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
        return list;
 | 
					        return list;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    static Select1Provider<T1> IncludeManyByPropertyNameCommonGetSelect<T1>(IFreeSql orm, string property, string where, int take, string select, Expression<Action<ISelect<object>>> then) where T1 : class
 | 
					    static Select1Provider<object> IncludeManyByPropertyNameCommonGetSelect(IFreeSql orm, Type entityType, string property, string where, int take, string select, Expression<Action<ISelect<object>>> then)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (orm.CodeFirst.IsAutoSyncStructure)
 | 
					        if (orm.CodeFirst.IsAutoSyncStructure)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var tb = orm.CodeFirst.GetTableByEntity(typeof(T1));
 | 
					            var tb = orm.CodeFirst.GetTableByEntity(entityType);
 | 
				
			||||||
            if (tb == null || tb.Primarys.Any() == false)
 | 
					            if (tb == null || tb.Primarys.Any() == false)
 | 
				
			||||||
                (orm.CodeFirst as CodeFirstProvider)._dicSycedTryAdd(typeof(T1)); //._dicSyced.TryAdd(typeof(TReturn), true);
 | 
					                (orm.CodeFirst as CodeFirstProvider)._dicSycedTryAdd(entityType); //._dicSyced.TryAdd(typeof(TReturn), true);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        var sel = orm.Select<T1>() as Select1Provider<T1>;
 | 
					        var sel = orm.Select<object>().AsType(entityType) as Select1Provider<object>;
 | 
				
			||||||
        var exp = sel.ConvertStringPropertyToExpression(property, true);
 | 
					        var exp = sel.ConvertStringPropertyToExpression(property, true);
 | 
				
			||||||
        if (exp == null) throw new ArgumentException(CoreStrings.Cannot_Resolve_ExpressionTree(nameof(property)));
 | 
					        if (exp == null) throw new ArgumentException(CoreStrings.Cannot_Resolve_ExpressionTree(nameof(property)));
 | 
				
			||||||
        var memExp = exp as MemberExpression;
 | 
					        var memExp = exp as MemberExpression;
 | 
				
			||||||
@@ -521,7 +520,13 @@ public static partial class FreeSqlGlobalExtensions
 | 
				
			|||||||
            newthen = newthenLambda.Compile();
 | 
					            newthen = newthenLambda.Compile();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var funcType = typeof(Func<,>).MakeGenericType(sel._tables[0].Table.Type, typeof(IEnumerable<>).MakeGenericType(reftb.Type));
 | 
					        var funcType = typeof(Func<,>).MakeGenericType(typeof(object), typeof(IEnumerable<>).MakeGenericType(reftb.Type));
 | 
				
			||||||
 | 
					        if (sel._tables[0].Table.Type != typeof(object))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var expParm = Expression.Parameter(typeof(object), sel._tables[0].Alias);
 | 
				
			||||||
 | 
					            exp = new Select0Provider.ReplaceMemberExpressionVisitor().Replace(exp, sel._tables[0].Parameter, Expression.Convert(expParm, sel._tables[0].Table.Type));
 | 
				
			||||||
 | 
					            sel._tables[0].Parameter = expParm;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        var navigateSelector = Expression.Lambda(funcType, exp, sel._tables[0].Parameter);
 | 
					        var navigateSelector = Expression.Lambda(funcType, exp, sel._tables[0].Parameter);
 | 
				
			||||||
        var incMethod = sel.GetType().GetMethod("IncludeMany");
 | 
					        var incMethod = sel.GetType().GetMethod("IncludeMany");
 | 
				
			||||||
        if (incMethod == null) throw new Exception(CoreStrings.RunTimeError_Reflection_IncludeMany);
 | 
					        if (incMethod == null) throw new Exception(CoreStrings.RunTimeError_Reflection_IncludeMany);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3806,184 +3806,201 @@
 | 
				
			|||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="P:FreeSql.Aop.TraceAfterEventArgs.Exception">
 | 
					        <member name="P:FreeSql.Aop.TraceAfterEventArgs.Exception">
 | 
				
			||||||
            <summary>
 | 
					                反序列化
 | 
				
			||||||
            发生的错误
 | 
					 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					            <param name="column"></param>
 | 
				
			||||||
        <member name="P:FreeSql.Aop.TraceAfterEventArgs.ElapsedTicks">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            耗时(单位:Ticks)
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="P:FreeSql.Aop.TraceAfterEventArgs.ElapsedMilliseconds">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            耗时(单位:毫秒)
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="P:FreeSql.ICodeFirst.IsAutoSyncStructure">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            【开发环境必备】自动同步实体结构到数据库,程序运行中检查实体表是否存在,然后创建或修改
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="P:FreeSql.ICodeFirst.IsSyncStructureToLower">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            转小写同步结构,适用 PostgreSQL
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="P:FreeSql.ICodeFirst.IsSyncStructureToUpper">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            转大写同步结构,适用 Oracle/达梦/人大金仓
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="P:FreeSql.ICodeFirst.IsConfigEntityFromDbFirst">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            将数据库的主键、自增、索引设置导入,适用 DbFirst 模式,无须在实体类型上设置 [Column(IsPrimary)] 或者 ConfigEntity。此功能目前可用于 mysql/sqlserver/postgresql/oracle。<para></para>
 | 
					 | 
				
			||||||
            本功能会影响 IFreeSql 首次访问的速度。<para></para>
 | 
					 | 
				
			||||||
            若使用 CodeFirst 创建索引后,又直接在数据库上建了索引,若无本功能下一次 CodeFirst 迁移时数据库上创建的索引将被删除
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="P:FreeSql.ICodeFirst.IsNoneCommandParameter">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            不使用命令参数化执行,针对 Insert/Update
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="P:FreeSql.ICodeFirst.IsGenerateCommandParameterWithLambda">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            是否生成命令参数化执行,针对 lambda 表达式解析<para></para>
 | 
					 | 
				
			||||||
            注意:常量不会参数化,变量才会做参数化<para></para>
 | 
					 | 
				
			||||||
            var id = 100;
 | 
					 | 
				
			||||||
            fsql.Select<T>().Where(a => a.id == id) 会参数化<para></para>
 | 
					 | 
				
			||||||
            fsql.Select<T>().Where(a => a.id == 100) 不会参数化
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="P:FreeSql.ICodeFirst.IsLazyLoading">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            延时加载导航属性对象,导航属性需要声明 virtual
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.ICodeFirst.GetComparisonDDLStatements``1">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            将实体类型与数据库对比,返回DDL语句
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <typeparam name="TEntity"></typeparam>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.ICodeFirst.GetComparisonDDLStatements(System.Type[])">
 | 
					        <member name="M:FreeSql.IDbFirst.GetEnumsByDatabase(System.String[])">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            将实体类型集合与数据库对比,返回DDL语句
 | 
					            获取数据库枚举类型,适用 PostgreSQL
 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="entityTypes">实体类型</param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.ICodeFirst.GetComparisonDDLStatements(System.Type,System.String)">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            将实体类型与数据库对比,返回DDL语句(指定表名)
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="entityType">实体类型</param>
 | 
					 | 
				
			||||||
            <param name="tableName">指定表名对比</param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.ICodeFirst.SyncStructure``1">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            同步实体类型到数据库<para></para>
 | 
					 | 
				
			||||||
            注意:生产环境中谨慎使用
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <typeparam name="TEntity"></typeparam>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.ICodeFirst.SyncStructure(System.Type[])">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            同步实体类型集合到数据库<para></para>
 | 
					 | 
				
			||||||
            注意:生产环境中谨慎使用
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="entityTypes"></param>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.ICodeFirst.SyncStructure(System.Type,System.String,System.Boolean)">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            同步实体类型到数据库(指定表名)<para></para>
 | 
					 | 
				
			||||||
            注意:生产环境中谨慎使用
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="entityType">实体类型</param>
 | 
					 | 
				
			||||||
            <param name="tableName">指定表名对比</param>
 | 
					 | 
				
			||||||
            <param name="isForceSync">强制同步结构,无视缓存每次都同步</param>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.ICodeFirst.GetDbInfo(System.Type)">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            根据 System.Type 获取数据库信息
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="type"></param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.ICodeFirst.ConfigEntity``1(System.Action{FreeSql.DataAnnotations.TableFluent{``0}})">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            FreeSql FluentApi 配置实体,方法名与特性相同
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <typeparam name="T"></typeparam>
 | 
					 | 
				
			||||||
            <param name="entity"></param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.ICodeFirst.ConfigEntity(System.Type,System.Action{FreeSql.DataAnnotations.TableFluent})">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            FreeSql FluentApi 配置实体,方法名与特性相同
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="type"></param>
 | 
					 | 
				
			||||||
            <param name="entity"></param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.ICodeFirst.GetConfigEntity(System.Type)">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            获取 FreeSql FluentApi 配置实体的元数据
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="type"></param>
 | 
					 | 
				
			||||||
            <returns>未使用ConfigEntity配置时,返回null</returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.ICodeFirst.GetTableByEntity(System.Type)">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            获取实体类核心配置
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="type"></param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.IDbFirst.GetDatabases">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            获取所有数据库
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.IDbFirst.GetTablesByDatabase(System.String[])">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            获取指定数据库的表信息,包括表、列详情、主键、唯一键、索引、外键、备注
 | 
					 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
            <param name="database"></param>
 | 
					            <param name="database"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.IDbFirst.GetTableByName(System.String,System.Boolean)">
 | 
					        <member name="F:FreeSql.Internal.BaseDiyMemberExpression._lambdaParameter">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            获取指定单表信息,包括列详情、主键、唯一键、索引、备注
 | 
					            临时 LambdaExpression.Parameter
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
            <param name="name">表名,如:dbo.table1</param>
 | 
					        </member>
 | 
				
			||||||
            <param name="ignoreCase">是否忽略大小写</param>
 | 
					        <member name="M:FreeSql.Internal.CommonProvider.InsertOrUpdateProvider`1.SplitSourceByIdentityValueIsNull(System.Collections.Generic.List{`0})">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            如果实体类有自增属性,分成两个 List,有值的Item1 merge,无值的Item2 insert
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="source"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.IDbFirst.ExistsTable(System.String,System.Boolean)">
 | 
					        <member name="M:FreeSql.Internal.CommonProvider.InsertProvider`1.IgnoreCanInsert">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            判断表是否存在
 | 
					            AsType, Ctor, ClearData 三处地方需要重新加载
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
            <param name="name">表名,如:dbo.table1</param>
 | 
					        </member>
 | 
				
			||||||
            <param name="ignoreCase">是否忽略大小写</param>
 | 
					        <member name="M:FreeSql.Internal.CommonProvider.UpdateProvider`1.IgnoreCanUpdate">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            AsType, Ctor, ClearData 三处地方需要重新加载
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.Internal.CommonUtils.GetPropertyCommentByDescriptionAttribute(System.Type)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            动态读取 DescriptionAttribute 注释文本
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="type"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.IDbFirst.GetDbType(FreeSql.DatabaseModel.DbColumnInfo)">
 | 
					        <member name="M:FreeSql.Internal.CommonUtils.GetProperyCommentBySummary(System.Type)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            获取数据库枚举类型int值
 | 
					            通过属性的注释文本,通过 xml 读取
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
            <param name="column"></param>
 | 
					            <param name="type"></param>
 | 
				
			||||||
 | 
					            <returns>Dict:key=属性名,value=注释</returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="P:FreeSql.Internal.DbUpdateVersionException.Table">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            更新实体的元数据
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="P:FreeSql.Internal.DbUpdateVersionException.Sql">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            执行更新的 SQL
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="P:FreeSql.Internal.DbUpdateVersionException.DbParams">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            执行更新命令的参数
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="P:FreeSql.Internal.DbUpdateVersionException.Affrows">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            执行更新命令影响的行
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="P:FreeSql.Internal.DbUpdateVersionException.EntitySourceCount">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            更新的实体数量
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="P:FreeSql.Internal.DbUpdateVersionException.EntitySource">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            更新的实体
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="T:FreeSql.Internal.MappingPriorityType">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            映射优先级,默认: Attribute > FluentApi > Aop
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.MappingPriorityType.Attribute">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            实体特性<para></para>
 | 
				
			||||||
 | 
					            [Table(Name = "tabname")]<para></para>
 | 
				
			||||||
 | 
					            [Column(Name = "table_id")]
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.MappingPriorityType.FluentApi">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            流式接口<para></para>
 | 
				
			||||||
 | 
					            fsql.CodeFirst.ConfigEntity(a => a.Name("tabname"))<para></para>
 | 
				
			||||||
 | 
					            fsql.CodeFirst.ConfigEntity(a => a.Property(b => b.Id).Name("table_id"))
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.MappingPriorityType.Aop">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            AOP 特性 https://github.com/dotnetcore/FreeSql/wiki/AOP<para></para>
 | 
				
			||||||
 | 
					            fsql.Aop.ConfigEntity += (_, e) => e.ModifyResult.Name = "public.tabname";<para></para>
 | 
				
			||||||
 | 
					            fsql.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = "table_id";<para></para>
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.NameConvertType.None">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            不进行任何处理
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.NameConvertType.PascalCaseToUnderscore">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            将帕斯卡命名字符串转换为下划线分隔字符串
 | 
				
			||||||
 | 
					            <para></para>
 | 
				
			||||||
 | 
					            BigApple -> Big_Apple
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.NameConvertType.PascalCaseToUnderscoreWithUpper">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全大写
 | 
				
			||||||
 | 
					            <para></para>
 | 
				
			||||||
 | 
					            BigApple -> BIG_APPLE
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.NameConvertType.PascalCaseToUnderscoreWithLower">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全小写
 | 
				
			||||||
 | 
					            <para></para>
 | 
				
			||||||
 | 
					            BigApple -> big_apple
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.NameConvertType.ToUpper">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            将字符串转换为大写
 | 
				
			||||||
 | 
					            <para></para>
 | 
				
			||||||
 | 
					            BigApple -> BIGAPPLE
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.NameConvertType.ToLower">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            将字符串转换为小写
 | 
				
			||||||
 | 
					            <para></para>
 | 
				
			||||||
 | 
					            BigApple -> bigapple
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.StringConvertType.None">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            不进行任何处理
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.StringConvertType.PascalCaseToUnderscore">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            将帕斯卡命名字符串转换为下划线分隔字符串
 | 
				
			||||||
 | 
					            <para></para>
 | 
				
			||||||
 | 
					            BigApple -> Big_Apple
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.StringConvertType.PascalCaseToUnderscoreWithUpper">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全大写
 | 
				
			||||||
 | 
					            <para></para>
 | 
				
			||||||
 | 
					            BigApple -> BIG_APPLE
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.StringConvertType.PascalCaseToUnderscoreWithLower">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全小写
 | 
				
			||||||
 | 
					            <para></para>
 | 
				
			||||||
 | 
					            BigApple -> big_apple
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.StringConvertType.Upper">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            将字符串转换为大写
 | 
				
			||||||
 | 
					            <para></para>
 | 
				
			||||||
 | 
					            BigApple -> BIGAPPLE
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.StringConvertType.Lower">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            将字符串转换为小写
 | 
				
			||||||
 | 
					            <para></para>
 | 
				
			||||||
 | 
					            BigApple -> bigapple
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.Internal.GlobalFilter.Apply``1(System.String,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            创建一个过滤器<para></para>
 | 
				
			||||||
 | 
					            提示:在 Lambda 中判断登陆身份,请参考资料 AsyncLocal
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <typeparam name="TEntity"></typeparam>
 | 
				
			||||||
 | 
					            <param name="name">名字</param>
 | 
				
			||||||
 | 
					            <param name="where">表达式</param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.IDbFirst.GetCsConvert(FreeSql.DatabaseModel.DbColumnInfo)">
 | 
					        <member name="M:FreeSql.Internal.GlobalFilter.ApplyIf``1(System.String,System.Funm>
 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            获取c#转换,(int)、(long)
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="column"></param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.IDbFirst.GetCsTypeValue(FreeSql.DatabaseModel.DbColumnInfo)">
 | 
					        <member name="M:FreeSql.IDbFirst.GetCsTypeValue(FreeSql.DatabaseModel.DbColumnInfo)">
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -498,6 +498,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            protected override Expression VisitMember(MemberExpression node)
 | 
					            protected override Expression VisitMember(MemberExpression node)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (_findExp == node) return _replaceExp;
 | 
					                if (_findExp == node) return _replaceExp;
 | 
				
			||||||
 | 
					                if (node.Expression?.NodeType == ExpressionType.Parameter && node.Expression == _findExp)
 | 
				
			||||||
 | 
					                    return Expression.Property(_replaceExp, node.Member.Name);
 | 
				
			||||||
                return base.VisitMember(node);
 | 
					                return base.VisitMember(node);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -491,7 +491,13 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                case TableRefType.ManyToMany:
 | 
					                case TableRefType.ManyToMany:
 | 
				
			||||||
                case TableRefType.OneToMany:
 | 
					                case TableRefType.OneToMany:
 | 
				
			||||||
                case TableRefType.PgArrayToMany:
 | 
					                case TableRefType.PgArrayToMany:
 | 
				
			||||||
                    var funcType = typeof(Func<,>).MakeGenericType(_tables[0].Table.Type, typeof(IEnumerable<>).MakeGenericType(parTbref.RefEntityType));
 | 
					                    var funcType = typeof(Func<,>).MakeGenericType(typeof(T1), typeof(IEnumerable<>).MakeGenericType(parTbref.RefEntityType));
 | 
				
			||||||
 | 
					                    if (_tables[0].Table.Type != typeof(T1))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        var expParm = Expression.Parameter(typeof(T1), _tables[0].Alias);
 | 
				
			||||||
 | 
					                        exp = new ReplaceMemberExpressionVisitor().Replace(exp, _tables[0].Parameter, Expression.Convert(expParm, _tables[0].Table.Type));
 | 
				
			||||||
 | 
					                        _tables[0].Parameter = expParm;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                    var navigateSelector = Expression.Lambda(funcType, exp, _tables[0].Parameter);
 | 
					                    var navigateSelector = Expression.Lambda(funcType, exp, _tables[0].Parameter);
 | 
				
			||||||
                    var incMethod = this.GetType().GetMethod("IncludeMany");
 | 
					                    var incMethod = this.GetType().GetMethod("IncludeMany");
 | 
				
			||||||
                    if (incMethod == null) throw new Exception(CoreStrings.RunTimeError_Reflection_IncludeMany);
 | 
					                    if (incMethod == null) throw new Exception(CoreStrings.RunTimeError_Reflection_IncludeMany);
 | 
				
			||||||
@@ -580,6 +586,15 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        param = tmpExp as ParameterExpression;
 | 
					                        param = tmpExp as ParameterExpression;
 | 
				
			||||||
                        isbreak = true;
 | 
					                        isbreak = true;
 | 
				
			||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
 | 
					                    case ExpressionType.Convert:
 | 
				
			||||||
 | 
					                        var convertExp = tmpExp as UnaryExpression;
 | 
				
			||||||
 | 
					                        if (convertExp?.Operand.NodeType == ExpressionType.Parameter)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            param = convertExp.Operand as ParameterExpression;
 | 
				
			||||||
 | 
					                            isbreak = true;
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        throw new Exception(CoreStrings.Expression_Error_Use_Successive_MemberAccess_Type(exp));
 | 
				
			||||||
                    default:
 | 
					                    default:
 | 
				
			||||||
                        throw new Exception(CoreStrings.Expression_Error_Use_Successive_MemberAccess_Type(exp));
 | 
					                        throw new Exception(CoreStrings.Expression_Error_Use_Successive_MemberAccess_Type(exp));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -769,6 +784,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                var t1parm = Expression.Parameter(typeof(T1));
 | 
					                var t1parm = Expression.Parameter(typeof(T1));
 | 
				
			||||||
                Expression membersExp = t1parm;
 | 
					                Expression membersExp = t1parm;
 | 
				
			||||||
                Expression membersExpNotNull = null;
 | 
					                Expression membersExpNotNull = null;
 | 
				
			||||||
 | 
					                if (typeof(T1) != _tables[0].Table.Type) membersExp = Expression.TypeAs(membersExp, _tables[0].Table.Type);
 | 
				
			||||||
                foreach (var mem in members)
 | 
					                foreach (var mem in members)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    membersExp = Expression.MakeMemberAccess(membersExp, mem.Member);
 | 
					                    membersExp = Expression.MakeMemberAccess(membersExp, mem.Member);
 | 
				
			||||||
@@ -863,6 +879,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                    return getListValue1(item, propName);
 | 
					                    return getListValue1(item, propName);
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (list.Where(a => getListValue1(a, "") == null).Count() == list.Count) return; //Parent.Childs 当 parent 都是 NULL 就没有和要向下查询了
 | 
				
			||||||
                foreach (var item in list)
 | 
					                foreach (var item in list)
 | 
				
			||||||
                    setListValue(item, null);
 | 
					                    setListValue(item, null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user