- 修复 AsTreeCte + AsTable 无效的 bug;#1176

This commit is contained in:
2881099 2022-07-01 10:23:36 +08:00
parent 0e82d6c3e3
commit 1ba3e3ea2b
2 changed files with 28 additions and 10 deletions

View File

@ -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>

View File

@ -602,6 +602,13 @@ public static partial class FreeSqlGlobalExtensions
if (select._orm.CodeFirst.IsSyncStructureToLower) cteName = cteName.ToLower(); if (select._orm.CodeFirst.IsSyncStructureToLower) cteName = cteName.ToLower();
if (select._orm.CodeFirst.IsSyncStructureToUpper) cteName = cteName.ToUpper(); if (select._orm.CodeFirst.IsSyncStructureToUpper) cteName = cteName.ToUpper();
var tableRule = select._tableRule;
var tbDbName = (tableRule?.Invoke(tb.Type, tb.DbName) ?? tb.DbName);
if (select._orm.CodeFirst.IsSyncStructureToLower) tbDbName = tbDbName.ToLower();
if (select._orm.CodeFirst.IsSyncStructureToUpper) tbDbName = tbDbName.ToUpper();
if (select._orm.CodeFirst.IsAutoSyncStructure)
select._orm.CodeFirst.SyncStructure(tb.Type, tbDbName);
switch (select._orm.Ado.DataType) switch (select._orm.Ado.DataType)
{ {
case DataType.GBase: case DataType.GBase:
@ -649,16 +656,16 @@ public static partial class FreeSqlGlobalExtensions
FROM ( FROM (
SELECT @cte_ids as cte_ids, ( SELECT @cte_ids as cte_ids, (
SELECT @cte_ids := group_concat({select._commonUtils.QuoteSqlName(tbref.Columns[0].Attribute.Name)}) SELECT @cte_ids := group_concat({select._commonUtils.QuoteSqlName(tbref.Columns[0].Attribute.Name)})
FROM {select._commonUtils.QuoteSqlName(tb.DbName)} FROM {select._commonUtils.QuoteSqlName(tbDbName)}
WHERE find_in_set({select._commonUtils.QuoteSqlName(tbref.RefColumns[0].Attribute.Name)}, @cte_ids) WHERE find_in_set({select._commonUtils.QuoteSqlName(tbref.RefColumns[0].Attribute.Name)}, @cte_ids)
) as cte_cids, @cte_level := @cte_idcte_levels + 1 as cte_level ) as cte_cids, @cte_level := @cte_idcte_levels + 1 as cte_level
FROM {select._commonUtils.QuoteSqlName(tb.DbName)}, ( FROM {select._commonUtils.QuoteSqlName(tbDbName)}, (
SELECT @cte_ids := a.{select._commonUtils.QuoteSqlName(tbref.Columns[0].Attribute.Name)}, @cte_idcte_levels := 0 SELECT @cte_ids := a.{select._commonUtils.QuoteSqlName(tbref.Columns[0].Attribute.Name)}, @cte_idcte_levels := 0
FROM {select._commonUtils.QuoteSqlName(tb.DbName)} a FROM {select._commonUtils.QuoteSqlName(tbDbName)} a
WHERE 1=1{select._where} WHERE 1=1{select._where}
LIMIT 1) cte_tbb LIMIT 1) cte_tbb
WHERE @cte_ids IS NOT NULL WHERE @cte_ids IS NOT NULL
) cte_tbc, {select._commonUtils.QuoteSqlName(tb.DbName)} a ) cte_tbc, {select._commonUtils.QuoteSqlName(tbDbName)} a
WHERE find_in_set(a.{select._commonUtils.QuoteSqlName(tbref.Columns[0].Attribute.Name)}, cte_tbc.cte_ids)"; WHERE find_in_set(a.{select._commonUtils.QuoteSqlName(tbref.Columns[0].Attribute.Name)}, cte_tbc.cte_ids)";
select.WithSql(mysql56Sql).OrderBy("a.cte_level DESC"); select.WithSql(mysql56Sql).OrderBy("a.cte_level DESC");
select._where.Clear(); select._where.Clear();
@ -666,14 +673,14 @@ public static partial class FreeSqlGlobalExtensions
} }
mysql56Sql = $@"SELECT cte_tbc.cte_level, {select.GetAllFieldExpressionTreeLevel2().Field} mysql56Sql = $@"SELECT cte_tbc.cte_level, {select.GetAllFieldExpressionTreeLevel2().Field}
FROM ( FROM (
SELECT @cte_pid as cte_id, (SELECT @cte_pid := {select._commonUtils.QuoteSqlName(tbref.RefColumns[0].Attribute.Name)} FROM {select._commonUtils.QuoteSqlName(tb.DbName)} WHERE {select._commonUtils.QuoteSqlName(tbref.Columns[0].Attribute.Name)} = cte_id) as cte_pid, @cte_level := @cte_level + 1 as cte_level SELECT @cte_pid as cte_id, (SELECT @cte_pid := {select._commonUtils.QuoteSqlName(tbref.RefColumns[0].Attribute.Name)} FROM {select._commonUtils.QuoteSqlName(tbDbName)} WHERE {select._commonUtils.QuoteSqlName(tbref.Columns[0].Attribute.Name)} = cte_id) as cte_pid, @cte_level := @cte_level + 1 as cte_level
FROM {select._commonUtils.QuoteSqlName(tb.DbName)}, ( FROM {select._commonUtils.QuoteSqlName(tbDbName)}, (
SELECT @cte_pid := a.{select._commonUtils.QuoteSqlName(tbref.Columns[0].Attribute.Name)}, @cte_level := 0 SELECT @cte_pid := a.{select._commonUtils.QuoteSqlName(tbref.Columns[0].Attribute.Name)}, @cte_level := 0
FROM {select._commonUtils.QuoteSqlName(tb.DbName)} a FROM {select._commonUtils.QuoteSqlName(tbDbName)} a
WHERE 1=1{select._where} WHERE 1=1{select._where}
LIMIT 1) cte_tbb LIMIT 1) cte_tbb
) cte_tbc ) cte_tbc
JOIN {select._commonUtils.QuoteSqlName(tb.DbName)} a ON cte_tbc.cte_id = a.{select._commonUtils.QuoteSqlName(tbref.Columns[0].Attribute.Name)}"; JOIN {select._commonUtils.QuoteSqlName(tbDbName)} a ON cte_tbc.cte_id = a.{select._commonUtils.QuoteSqlName(tbref.Columns[0].Attribute.Name)}";
select.WithSql(mysql56Sql).OrderBy("a.cte_level"); select.WithSql(mysql56Sql).OrderBy("a.cte_level");
select._where.Clear(); select._where.Clear();
return select; return select;
@ -732,10 +739,12 @@ JOIN {select._commonUtils.QuoteSqlName(tb.DbName)} a ON cte_tbc.cte_id = a.{sele
} }
if (select._orm.CodeFirst.IsAutoSyncStructure) if (select._orm.CodeFirst.IsAutoSyncStructure)
(select._orm.CodeFirst as CodeFirstProvider)._dicSycedTryAdd(tb.Type, cteName); //#476 (select._orm.CodeFirst as CodeFirstProvider)._dicSycedTryAdd(tb.Type, cteName); //#476
select._tableRules.Clear();
var sql2 = select var sql2 = select
.AsAlias((type, old) => type == tb.Type ? old.Replace("wct2", "wct1") : old) .AsAlias((type, old) => type == tb.Type ? old.Replace("wct2", "wct1") : old)
.AsTable((type, old) => type == tb.Type ? cteName : old) .AsTable((type, old) => type == tb.Type ? cteName : (tableRule?.Invoke(type, old) ?? old))
.InnerJoin($"{select._commonUtils.QuoteSqlName(tb.DbName)} wct2 ON {sql2InnerJoinOn}") .InnerJoin($"{select._commonUtils.QuoteSqlName(tbDbName)} wct2 ON {sql2InnerJoinOn}")
.ToSql($"wct1.cte_level + 1 as cte_level, {sql2ctePath}{sql2Field}").Trim(); .ToSql($"wct1.cte_level + 1 as cte_level, {sql2ctePath}{sql2Field}").Trim();
var newSelect = select._orm.Select<T1>() var newSelect = select._orm.Select<T1>()