mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	- 增加 内部方法 DisplayCsharp,统一 LazyLoading 动态代码类名
This commit is contained in:
		@@ -110,13 +110,6 @@
 | 
				
			|||||||
            清空状态数据
 | 
					            清空状态数据
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.DbSet`1.RemoveAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            根据 lambda 条件删除数据
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="predicate"></param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.DbSet`1.Add(`0)">
 | 
					        <member name="M:FreeSql.DbSet`1.Add(`0)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            添加
 | 
					            添加
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,7 +16,7 @@ using System.Threading;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
public static partial class FreeSqlGlobalExtensions
 | 
					public static partial class FreeSqlGlobalExtensions
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    static Lazy<Dictionary<Type, bool>> dicIsNumberType = new Lazy<Dictionary<Type, bool>>(() => new Dictionary<Type, bool>
 | 
					    static Lazy<Dictionary<Type, bool>> _dicIsNumberType = new Lazy<Dictionary<Type, bool>>(() => new Dictionary<Type, bool>
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        [typeof(sbyte)] = true,
 | 
					        [typeof(sbyte)] = true,
 | 
				
			||||||
        [typeof(sbyte?)] = true,
 | 
					        [typeof(sbyte?)] = true,
 | 
				
			||||||
@@ -41,13 +41,60 @@ public static partial class FreeSqlGlobalExtensions
 | 
				
			|||||||
        [typeof(decimal)] = false,
 | 
					        [typeof(decimal)] = false,
 | 
				
			||||||
        [typeof(decimal?)] = false
 | 
					        [typeof(decimal?)] = false
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    public static bool IsIntegerType(this Type that) => that == null ? false : (dicIsNumberType.Value.TryGetValue(that, out var tryval) ? tryval : false);
 | 
					    public static bool IsIntegerType(this Type that) => that == null ? false : (_dicIsNumberType.Value.TryGetValue(that, out var tryval) ? tryval : false);
 | 
				
			||||||
    public static bool IsNumberType(this Type that) => that == null ? false : dicIsNumberType.Value.ContainsKey(that);
 | 
					    public static bool IsNumberType(this Type that) => that == null ? false : _dicIsNumberType.Value.ContainsKey(that);
 | 
				
			||||||
    public static bool IsNullableType(this Type that) => that.IsArray == false && that?.FullName.StartsWith("System.Nullable`1[") == true;
 | 
					    public static bool IsNullableType(this Type that) => that.IsArray == false && that?.FullName.StartsWith("System.Nullable`1[") == true;
 | 
				
			||||||
    public static bool IsAnonymousType(this Type that) => that?.FullName.StartsWith("<>f__AnonymousType") == true;
 | 
					    public static bool IsAnonymousType(this Type that) => that?.FullName.StartsWith("<>f__AnonymousType") == true;
 | 
				
			||||||
    public static bool IsArrayOrList(this Type that) => that == null ? false : (that.IsArray || typeof(IList).IsAssignableFrom(that));
 | 
					    public static bool IsArrayOrList(this Type that) => that == null ? false : (that.IsArray || typeof(IList).IsAssignableFrom(that));
 | 
				
			||||||
    public static Type NullableTypeOrThis(this Type that) => that?.IsNullableType() == true ? that.GetGenericArguments().First() : that;
 | 
					    public static Type NullableTypeOrThis(this Type that) => that?.IsNullableType() == true ? that.GetGenericArguments().First() : that;
 | 
				
			||||||
    internal static string NotNullAndConcat(this string that, params object[] args) => string.IsNullOrEmpty(that) ? null : string.Concat(new object[] { that }.Concat(args));
 | 
					    internal static string NotNullAndConcat(this string that, params object[] args) => string.IsNullOrEmpty(that) ? null : string.Concat(new object[] { that }.Concat(args));
 | 
				
			||||||
 | 
					    /// <summary>
 | 
				
			||||||
 | 
					    /// 获取 Type 的原始 c# 文本表示
 | 
				
			||||||
 | 
					    /// </summary>
 | 
				
			||||||
 | 
					    /// <param name="that"></param>
 | 
				
			||||||
 | 
					    /// <returns></returns>
 | 
				
			||||||
 | 
					    public static string DisplayCsharp(this Type that)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return DisplayCsharp(that, true);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    static string DisplayCsharp(this Type that, bool isNameSpace)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (that == typeof(void)) return "void";
 | 
				
			||||||
 | 
					        if (that.IsGenericParameter) return that.Name;
 | 
				
			||||||
 | 
					        var sb = new StringBuilder();
 | 
				
			||||||
 | 
					        var nestedType = that;
 | 
				
			||||||
 | 
					        while (nestedType.IsNested)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            sb.Insert(0, ".").Insert(0, DisplayCsharp(nestedType.DeclaringType, false));
 | 
				
			||||||
 | 
					            nestedType = nestedType.DeclaringType;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (isNameSpace && string.IsNullOrEmpty(nestedType.Namespace) == false)
 | 
				
			||||||
 | 
					            sb.Insert(0, ".").Insert(0, nestedType.Namespace);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (that.IsGenericType == false)
 | 
				
			||||||
 | 
					            return sb.Append(that.Name).ToString();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var genericParameters = that.GetGenericArguments();
 | 
				
			||||||
 | 
					        if (that.IsNested && that.DeclaringType.IsGenericType)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var dic = genericParameters.ToDictionary(a => a.Name);
 | 
				
			||||||
 | 
					            foreach (var nestedGenericParameter in that.DeclaringType.GetGenericArguments())
 | 
				
			||||||
 | 
					                if (dic.ContainsKey(nestedGenericParameter.Name))
 | 
				
			||||||
 | 
					                    dic.Remove(nestedGenericParameter.Name);
 | 
				
			||||||
 | 
					            genericParameters = dic.Values.ToArray();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (genericParameters.Any() == false)
 | 
				
			||||||
 | 
					            return sb.Append(that.Name).ToString();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sb.Append(that.Name.Remove(that.Name.IndexOf('`'))).Append("<");
 | 
				
			||||||
 | 
					        var genericTypeIndex = 0;
 | 
				
			||||||
 | 
					        foreach (var genericType in genericParameters)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (genericTypeIndex++ > 0) sb.Append(", ");
 | 
				
			||||||
 | 
					            sb.Append(DisplayCsharp(genericType, true));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return sb.Append(">").ToString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    public static object CreateInstanceGetDefaultValue(this Type that)
 | 
					    public static object CreateInstanceGetDefaultValue(this Type that)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (that == null) return null;
 | 
					        if (that == null) return null;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3194,6 +3194,13 @@
 | 
				
			|||||||
            <param name="end"></param>
 | 
					            <param name="end"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSqlGlobalExtensions.DisplayCsharp(System.Type)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            获取 Type 的原始 c# 文本表示
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="that"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSqlGlobalExtensions.Distance(System.Drawing.Point,System.Drawing.Point)">
 | 
					        <member name="M:FreeSqlGlobalExtensions.Distance(System.Drawing.Point,System.Drawing.Point)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            测量两个经纬度的距离,返回单位:米
 | 
					            测量两个经纬度的距离,返回单位:米
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -397,7 +397,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
            tbc.AddOrUpdate(entity, trytb, (oldkey, oldval) => trytb);
 | 
					            tbc.AddOrUpdate(entity, trytb, (oldkey, oldval) => trytb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            #region 查找导航属性的关系、virtual 属性延时加载,动态产生新的重写类
 | 
					            #region 查找导航属性的关系、virtual 属性延时加载,动态产生新的重写类
 | 
				
			||||||
            var trytbTypeName = trytb.Type.IsNested ? $"{trytb.Type.DeclaringType.Namespace?.NotNullAndConcat(".")}{trytb.Type.DeclaringType.Name}.{trytb.Type.Name}" : $"{trytb.Type.Namespace?.NotNullAndConcat(".")}{trytb.Type.Name}";
 | 
					            var trytbTypeName = trytb.Type.DisplayCsharp();
 | 
				
			||||||
            var trytbTypeLazyName = default(string);
 | 
					            var trytbTypeLazyName = default(string);
 | 
				
			||||||
            StringBuilder cscode = null;
 | 
					            StringBuilder cscode = null;
 | 
				
			||||||
            if (common.CodeFirst.IsLazyLoading && propsLazy.Any())
 | 
					            if (common.CodeFirst.IsLazyLoading && propsLazy.Any())
 | 
				
			||||||
@@ -448,10 +448,8 @@ namespace FreeSql.Internal
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        public static void AddTableRef(CommonUtils common, TableInfo trytb, PropertyInfo pnv, bool isLazy, NaviteTuple<PropertyInfo, bool, bool> vp, StringBuilder cscode)
 | 
					        public static void AddTableRef(CommonUtils common, TableInfo trytb, PropertyInfo pnv, bool isLazy, NaviteTuple<PropertyInfo, bool, bool> vp, StringBuilder cscode)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var trytbTypeName = trytb.Type.IsNested ? $"{trytb.Type.DeclaringType.Namespace?.NotNullAndConcat(".")}{trytb.Type.DeclaringType.Name}.{trytb.Type.Name}" : $"{trytb.Type.Namespace?.NotNullAndConcat(".")}{trytb.Type.Name}";
 | 
					            var trytbTypeName = trytb.Type.DisplayCsharp();
 | 
				
			||||||
            var propTypeName = pnv.PropertyType.IsGenericType ?
 | 
					            var propTypeName = pnv.PropertyType.DisplayCsharp();
 | 
				
			||||||
                    $"{pnv.PropertyType.Namespace?.NotNullAndConcat(".")}{pnv.PropertyType.Name.Remove(pnv.PropertyType.Name.IndexOf('`'))}<{string.Join(", ", pnv.PropertyType.GetGenericArguments().Select(a => a.IsNested ? $"{a.DeclaringType.Namespace?.NotNullAndConcat(".")}{a.DeclaringType.Name}.{a.Name}" : $"{a.Namespace?.NotNullAndConcat(".")}{a.Name}"))}>" :
 | 
					 | 
				
			||||||
                    (pnv.PropertyType.IsNested ? $"{pnv.PropertyType.DeclaringType.Namespace?.NotNullAndConcat(".")}{pnv.PropertyType.DeclaringType.Name}.{pnv.PropertyType.Name}" : $"{pnv.PropertyType.Namespace?.NotNullAndConcat(".")}{pnv.PropertyType.Name}");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var pnvAttr = common.GetEntityNavigateAttribute(trytb.Type, pnv);
 | 
					            var pnvAttr = common.GetEntityNavigateAttribute(trytb.Type, pnv);
 | 
				
			||||||
            var pnvBind = pnvAttr?.Bind?.Split(',').Select(a => a.Trim()).Where(a => !string.IsNullOrEmpty(a)).ToArray();
 | 
					            var pnvBind = pnvAttr?.Bind?.Split(',').Select(a => a.Trim()).Where(a => !string.IsNullOrEmpty(a)).ToArray();
 | 
				
			||||||
@@ -474,7 +472,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                var tbref = propElementType == trytb.Type ? trytb : GetTableByEntity(propElementType, common); //可能是父子关系
 | 
					                var tbref = propElementType == trytb.Type ? trytb : GetTableByEntity(propElementType, common); //可能是父子关系
 | 
				
			||||||
                if (tbref == null) return;
 | 
					                if (tbref == null) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var tbrefTypeName = tbref.Type.IsNested ? $"{tbref.Type.DeclaringType.Namespace?.NotNullAndConcat(".")}{tbref.Type.DeclaringType.Name}.{tbref.Type.Name}" : $"{tbref.Type.Namespace?.NotNullAndConcat(".")}{tbref.Type.Name}";
 | 
					                var tbrefTypeName = tbref.Type.DisplayCsharp();
 | 
				
			||||||
                Type midType = null;
 | 
					                Type midType = null;
 | 
				
			||||||
                var isManyToMany = false;
 | 
					                var isManyToMany = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -797,8 +795,8 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                                .Append("			if (base.").Append(pnv.Name).Append(" == null && __lazy__").Append(pnv.Name).AppendLine(" == false) {");
 | 
					                                .Append("			if (base.").Append(pnv.Name).Append(" == null && __lazy__").Append(pnv.Name).AppendLine(" == false) {");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            if (nvref.Exception == null)
 | 
					                            if (nvref.Exception == null)
 | 
				
			||||||
                                cscode.Append("				base.").Append(pnv.Name).Append(" = __fsql_orm__.Select<").Append(propElementType.IsNested ? $"{propElementType.DeclaringType.Namespace?.NotNullAndConcat(".")}{propElementType.DeclaringType.Name}.{propElementType.Name}" : $"{propElementType.Namespace?.NotNullAndConcat(".")}{propElementType.Name}")
 | 
					                                cscode.Append("				base.").Append(pnv.Name).Append(" = __fsql_orm__.Select<").Append(propElementType.DisplayCsharp())
 | 
				
			||||||
                                    .Append(">().Where(a => __fsql_orm__.Select<").Append(tbmid.Type.IsNested ? $"{tbmid.Type.DeclaringType.Namespace?.NotNullAndConcat(".")}{tbmid.Type.DeclaringType.Name}.{tbmid.Type.Name}" : $"{tbmid.Type.Namespace?.NotNullAndConcat(".")}{tbmid.Type.Name}")
 | 
					                                    .Append(">().Where(a => __fsql_orm__.Select<").Append(tbmid.Type.DisplayCsharp())
 | 
				
			||||||
                                    .Append(">().Where(b => ").Append(lmbdWhere.ToString()).AppendLine(").Any()).ToList();")
 | 
					                                    .Append(">().Where(b => ").Append(lmbdWhere.ToString()).AppendLine(").Any()).ToList();")
 | 
				
			||||||
                                    .Append("				__lazy__").Append(pnv.Name).AppendLine(" = true;");
 | 
					                                    .Append("				__lazy__").Append(pnv.Name).AppendLine(" = true;");
 | 
				
			||||||
                            else
 | 
					                            else
 | 
				
			||||||
@@ -933,7 +931,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                            if (nvref.Exception == null)
 | 
					                            if (nvref.Exception == null)
 | 
				
			||||||
                            {
 | 
					                            {
 | 
				
			||||||
                                cscode.Append("				base.").Append(pnv.Name).Append(" = __fsql_orm__.Select<").Append(propElementType.IsNested ? $"{propElementType.DeclaringType.Namespace?.NotNullAndConcat(".")}{propElementType.DeclaringType.Name}.{propElementType.Name}" : $"{propElementType.Namespace?.NotNullAndConcat(".")}{propElementType.Name}").Append(">().Where(a => ").Append(lmbdWhere.ToString()).AppendLine(").ToList();");
 | 
					                                cscode.Append("				base.").Append(pnv.Name).Append(" = __fsql_orm__.Select<").Append(propElementType.DisplayCsharp()).Append(">().Where(a => ").Append(lmbdWhere.ToString()).AppendLine(").ToList();");
 | 
				
			||||||
                                if (refprop != null)
 | 
					                                if (refprop != null)
 | 
				
			||||||
                                {
 | 
					                                {
 | 
				
			||||||
                                    cscode.Append("				foreach (var loc1 in base.").Append(pnv.Name).AppendLine(")")
 | 
					                                    cscode.Append("				foreach (var loc1 in base.").Append(pnv.Name).AppendLine(")")
 | 
				
			||||||
@@ -969,7 +967,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                    trytb.AddOrUpdateTableRef(pnv.Name, nvref);
 | 
					                    trytb.AddOrUpdateTableRef(pnv.Name, nvref);
 | 
				
			||||||
                    //if (isLazy) throw nvref.Exception;
 | 
					                    //if (isLazy) throw nvref.Exception;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                var tbrefTypeName = tbref.Type.IsNested ? $"{tbref.Type.DeclaringType.Namespace?.NotNullAndConcat(".")}{tbref.Type.DeclaringType.Name}.{tbref.Type.Name}" : $"{tbref.Type.Namespace?.NotNullAndConcat(".")}{tbref.Type.Name}";
 | 
					                var tbrefTypeName = tbref.Type.DisplayCsharp();
 | 
				
			||||||
                var isOnoToOne = pnv.PropertyType != trytb.Type &&
 | 
					                var isOnoToOne = pnv.PropertyType != trytb.Type &&
 | 
				
			||||||
                    tbref.Properties.Where(z => z.Value.PropertyType == trytb.Type).Any() &&
 | 
					                    tbref.Properties.Where(z => z.Value.PropertyType == trytb.Type).Any() &&
 | 
				
			||||||
                    tbref.Primarys.Length == trytb.Primarys.Length &&
 | 
					                    tbref.Primarys.Length == trytb.Primarys.Length &&
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user