mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	- 修复 FromQueryMulti 多表重载可能出现的 null 对象报错;(合并 FromQuery 和 FromQueryMulti 代码)
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>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -78,7 +78,8 @@ WHERE (a.[RN] < 2)", sql);
 | 
				
			|||||||
                });
 | 
					                });
 | 
				
			||||||
            Assert.Equal(@"SELECT a.[CkassIfCation] as1, b.[DeliveryInstractionStatus] as2, b.[UpTime] as3, 1 as4, c.[RunNo] as5 
 | 
					            Assert.Equal(@"SELECT a.[CkassIfCation] as1, b.[DeliveryInstractionStatus] as2, b.[UpTime] as3, 1 as4, c.[RunNo] as5 
 | 
				
			||||||
FROM [UnitLog] a 
 | 
					FROM [UnitLog] a 
 | 
				
			||||||
INNER JOIN (SELECT a.[LoadNo], a.[SeqNoLog], c.[DeliveryInstractionStatus], c.[UpTime], row_number() over( partition by a.[UnitId] order by a.[SeqNoLog] desc) [RN] 
 | 
					INNER JOIN ( 
 | 
				
			||||||
 | 
					    SELECT a.[LoadNo], a.[SeqNoLog], c.[DeliveryInstractionStatus], c.[UpTime], row_number() over( partition by a.[UnitId] order by a.[SeqNoLog] desc) [RN] 
 | 
				
			||||||
    FROM [UnitLog] a 
 | 
					    FROM [UnitLog] a 
 | 
				
			||||||
    INNER JOIN [LoadPlan] b ON a.[LoadNo] = b.[LoadNo] AND a.[UnitTransactionType] = N'TO' 
 | 
					    INNER JOIN [LoadPlan] b ON a.[LoadNo] = b.[LoadNo] AND a.[UnitTransactionType] = N'TO' 
 | 
				
			||||||
    INNER JOIN [Instruction] c ON b.[InstructionNo] = c.[InstructionNo] ) b ON a.[SeqNoLog] = b.[SeqNoLog] 
 | 
					    INNER JOIN [Instruction] c ON b.[InstructionNo] = c.[InstructionNo] ) b ON a.[SeqNoLog] = b.[SeqNoLog] 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -126,74 +126,31 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
        public ISelect<T1, T2> FromQuery<T2>(ISelect<T2> select2) where T2 : class
 | 
					        public ISelect<T1, T2> FromQuery<T2>(ISelect<T2> select2) where T2 : class
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var ret = From<T2>();
 | 
					            var ret = From<T2>();
 | 
				
			||||||
            var retsp = ret as Select0Provider;
 | 
					            return FromQueryMulti(ret, new[] { typeof(T2) }, new[] { select2 as Select0Provider });
 | 
				
			||||||
            var rettbs = retsp._tables;
 | 
					 | 
				
			||||||
            if (rettbs[1].Table == null) rettbs[1].Table = TableInfo.GetDefaultTable(typeof(T2));
 | 
					 | 
				
			||||||
            var select2sp = select2 as Select0Provider;
 | 
					 | 
				
			||||||
            (_diymemexpWithTempQuery as WithTempQueryParser)?.Append(select2sp, rettbs[1]);
 | 
					 | 
				
			||||||
            string sql2 = null;
 | 
					 | 
				
			||||||
            if (select2sp._diymemexpWithTempQuery == null)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                if (select2sp._tableRule == null && select2sp._tables[0].Table.Type == typeof(T2) && select2sp.IsDefaultSqlContent == true)
 | 
					 | 
				
			||||||
                    return ret;
 | 
					 | 
				
			||||||
                sql2 = select2?.ToSql(a => a, FieldAliasOptions.AsProperty);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                if (retsp._diymemexpWithTempQuery == null)
 | 
					 | 
				
			||||||
                    retsp._diymemexpWithTempQuery = new WithTempQueryParser(null, null, null, null).Append(select2sp, rettbs[1]);
 | 
					 | 
				
			||||||
                if (select2sp._tableRule != null && select2sp.IsDefaultSqlContent == true)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    sql2 = select2sp._tableRule(select2sp._tables[0].Table.Type, null);
 | 
					 | 
				
			||||||
                    if (sql2.StartsWith("(") && sql2.EndsWith(")")) sql2 = sql2.Substring(1, sql2.Length - 2);
 | 
					 | 
				
			||||||
                    if (sql2.StartsWith(" \r\n")) sql2 = sql2.Substring(3);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                if (string.IsNullOrWhiteSpace(sql2))
 | 
					 | 
				
			||||||
                    sql2 = select2?.ToSql("*");
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            if (retsp._tableRules.Count > 0)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                var tbrules = retsp._tableRules.ToList();
 | 
					 | 
				
			||||||
                retsp._tableRules.Clear();
 | 
					 | 
				
			||||||
                tbrules.ForEach(tbrule =>
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    var tbruler1 = tbrule(typeof(T1), retsp._tables[0].Table.DbName);
 | 
					 | 
				
			||||||
                    if (string.IsNullOrWhiteSpace(tbruler1) == false)
 | 
					 | 
				
			||||||
                        retsp._tableRules.Add((type, old) =>
 | 
					 | 
				
			||||||
                        {
 | 
					 | 
				
			||||||
                            if (type == typeof(T1)) return tbruler1;
 | 
					 | 
				
			||||||
                            if (type == typeof(T2)) return $"( \r\n{sql2})";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                            return old;
 | 
					 | 
				
			||||||
                        });
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            if (retsp._tableRules.Count == 0) ret.WithSql(null, $" \r\n{sql2}");
 | 
					 | 
				
			||||||
            return ret;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public TQuery FromQueryMulti<TQuery>(TQuery ret, Type[] entityTypes, Select0Provider[] querys)
 | 
					        public TQuery FromQueryMulti<TQuery>(TQuery ret, Type[] entityTypes, Select0Provider[] querys)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var retsp = ret as Select0Provider;
 | 
					            var retsp = ret as Select0Provider;
 | 
				
			||||||
            var rettbs = retsp._tables;
 | 
					            var rettbs = retsp._tables;
 | 
				
			||||||
            var sql2List = new string[rettbs.Count - 1];
 | 
					            var sql2List = new string[querys.Length];
 | 
				
			||||||
            for (var a = 1; a < rettbs.Count; a++)
 | 
					            for (var a = 0; a < querys.Length; a++)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                var select2 = querys[a - 1];
 | 
					                var select2 = querys[a];
 | 
				
			||||||
                var entityType2 = entityTypes[a - 1];
 | 
					                var entityType2 = entityTypes[a];
 | 
				
			||||||
                var rettb2 = rettbs[a];
 | 
					                var rettb2 = rettbs[a + 1];
 | 
				
			||||||
                if (rettb2.Table == null) rettb2.Table = TableInfo.GetDefaultTable(entityType2);
 | 
					                if (rettb2.Table == null) rettb2.Table = TableInfo.GetDefaultTable(entityType2);
 | 
				
			||||||
                (_diymemexpWithTempQuery as WithTempQueryParser)?.Append(select2, rettb2);
 | 
					                (retsp._diymemexpWithTempQuery as WithTempQueryParser)?.Append(select2, rettb2);
 | 
				
			||||||
                string sql2 = null;
 | 
					                string sql2 = null;
 | 
				
			||||||
                if (select2._diymemexpWithTempQuery == null)
 | 
					                if (select2._diymemexpWithTempQuery == null)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    if (select2._tableRule == null && select2._tables[0].Table.Type == entityType2 && select2.IsDefaultSqlContent == true)
 | 
					                    if (select2._tableRule == null && select2._tables[0].Table.Type == entityType2 && select2.IsDefaultSqlContent == true)
 | 
				
			||||||
                        continue;
 | 
					                        continue;
 | 
				
			||||||
                    var selectorParameter = Expression.Parameter(entityType2);
 | 
					                    var selectorParameter = Expression.Parameter(entityType2, select2._tables[0].Alias);
 | 
				
			||||||
                    var selector = Expression.Lambda(selectorParameter, selectorParameter);
 | 
					                    var selector = Expression.Lambda(selectorParameter, selectorParameter);
 | 
				
			||||||
                    select2._tables[0].Parameter = selectorParameter;
 | 
					                    select2._tables[0].Parameter = selectorParameter;
 | 
				
			||||||
                    var af = this.GetExpressionField(selector, FieldAliasOptions.AsProperty);
 | 
					                    var af = select2.GetExpressionField(selector, FieldAliasOptions.AsProperty);
 | 
				
			||||||
                    sql2 = this.ToSql(af.field);
 | 
					                    sql2 = select2.ToSqlBase(af.field);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                else
 | 
					                else
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@@ -208,7 +165,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                    if (string.IsNullOrWhiteSpace(sql2))
 | 
					                    if (string.IsNullOrWhiteSpace(sql2))
 | 
				
			||||||
                        sql2 = select2.ToSqlBase("*");
 | 
					                        sql2 = select2.ToSqlBase("*");
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                sql2List[a - 1] = sql2;
 | 
					                sql2List[a] = sql2;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (retsp._tableRules.Count > 0)
 | 
					            if (retsp._tableRules.Count > 0)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -232,7 +189,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                retsp.AsTableBase((type, old) =>
 | 
					                retsp.AsTableBase((type, old) =>
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    for (var a = 0; a < entityTypes.Length; a++)
 | 
					                    for (var a = 0; a < entityTypes.Length; a++)
 | 
				
			||||||
                        if (entityTypes[a] == type) return string.IsNullOrWhiteSpace(sql2List[a]) ? old : $"({sql2List[a]})";
 | 
					                        if (entityTypes[a] == type) return string.IsNullOrWhiteSpace(sql2List[a]) ? old : $"( \r\n{sql2List[a]})";
 | 
				
			||||||
                    return old;
 | 
					                    return old;
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -622,8 +622,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        Attribute = new DataAnnotations.ColumnAttribute
 | 
					                        Attribute = new DataAnnotations.ColumnAttribute
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            Name = colName,
 | 
					                            Name = colName,
 | 
				
			||||||
                            MapType = colType,
 | 
					                            MapType = colType
 | 
				
			||||||
                            DbType = "", //for SqlServer: ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a))
 | 
					 | 
				
			||||||
                        },
 | 
					                        },
 | 
				
			||||||
                        CsType = colType
 | 
					                        CsType = colType
 | 
				
			||||||
                    };
 | 
					                    };
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,7 +39,7 @@ namespace FreeSql.Custom.SqlServer
 | 
				
			|||||||
                return (bool)param ? 1 : 0;
 | 
					                return (bool)param ? 1 : 0;
 | 
				
			||||||
            else if (param is string)
 | 
					            else if (param is string)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false)
 | 
					                if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && !string.IsNullOrWhiteSpace(mapColumn.Attribute.DbType) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false)
 | 
				
			||||||
                    return string.Concat("'", param.ToString().Replace("'", "''"), "'");
 | 
					                    return string.Concat("'", param.ToString().Replace("'", "''"), "'");
 | 
				
			||||||
                return string.Concat("N'", param.ToString().Replace("'", "''"), "'");
 | 
					                return string.Concat("N'", param.ToString().Replace("'", "''"), "'");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,7 +47,7 @@ namespace FreeSql.Odbc.SqlServer
 | 
				
			|||||||
                return (bool)param ? 1 : 0;
 | 
					                return (bool)param ? 1 : 0;
 | 
				
			||||||
            else if (param is string)
 | 
					            else if (param is string)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false)
 | 
					                if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && !string.IsNullOrWhiteSpace(mapColumn.Attribute.DbType) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false)
 | 
				
			||||||
                    return string.Concat("'", param.ToString().Replace("'", "''"), "'");
 | 
					                    return string.Concat("'", param.ToString().Replace("'", "''"), "'");
 | 
				
			||||||
                return string.Concat("N'", param.ToString().Replace("'", "''"), "'");
 | 
					                return string.Concat("N'", param.ToString().Replace("'", "''"), "'");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,7 +53,7 @@ namespace FreeSql.SqlServer
 | 
				
			|||||||
                return (bool)param ? 1 : 0;
 | 
					                return (bool)param ? 1 : 0;
 | 
				
			||||||
            else if (param is string)
 | 
					            else if (param is string)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false)
 | 
					                if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && !string.IsNullOrWhiteSpace(mapColumn.Attribute.DbType) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false)
 | 
				
			||||||
                    return string.Concat("'", param.ToString().Replace("'", "''"), "'");
 | 
					                    return string.Concat("'", param.ToString().Replace("'", "''"), "'");
 | 
				
			||||||
                return string.Concat("N'", param.ToString().Replace("'", "''"), "'");
 | 
					                return string.Concat("N'", param.ToString().Replace("'", "''"), "'");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user