11using System ;
2+ using System . Collections . Generic ;
23using System . Collections . ObjectModel ;
34using System . Linq ;
45using System . Text ;
@@ -36,6 +37,9 @@ public static SQLQueryCompiled Compile(ISQLQuery query,
3637 ISQLQueryParametersBuilder parameterBuilder ,
3738 ISQLQueryTableNameResolver tableNameResolver )
3839 {
40+ parameterBuilder . Initialize ( ) ;
41+ tableNameResolver . Initialize ( ) ;
42+
3943 var translatedQuery = CompileQuery ( query , parameterBuilder , tableNameResolver ) ;
4044
4145 return new SQLQueryCompiled ( translatedQuery , new ReadOnlyCollection < SQLQueryParameter > ( parameterBuilder . Parameters . Select ( p => p . Value ) . ToList ( ) ) ) ;
@@ -46,10 +50,7 @@ internal static string CompileQuery(
4650 ISQLQueryParametersBuilder parameterBuilder ,
4751 ISQLQueryTableNameResolver tableNameResolver )
4852 {
49- parameterBuilder . Initialize ( ) ;
50- tableNameResolver . Initialize ( ) ;
51-
52- var cteList = query . Where ( f => f . FragmentType == SQLQueryFragmentType . SelectCte ) . ToList ( ) ;
53+ var cteList = query . GetHierachicalSelectCte ( ) ;
5354 if ( cteList . Count > 1 && cteList . Select ( t => t . GetType ( ) . GenericTypeArguments [ 0 ] ) . Distinct ( ) . Count ( ) != cteList . Count )
5455 {
5556 throw new NotSupportedException ( "Multiple declaration of CTE TABLEs for the same Entity is not supported." ) ;
@@ -59,15 +60,22 @@ internal static string CompileQuery(
5960
6061 var translatedQueryBuilder = new StringBuilder ( ) ;
6162
63+ var cteFragmentsTranslated = new List < ISQLQueryFragment > ( ) ;
64+
6265 if ( cteList . Count > 0 )
6366 {
6467 var idx = cteList . Count - 1 ;
6568 foreach ( var cte in cteList )
6669 {
67- var withTableFragments = ( ISQLQuery ) cte ;
70+ var withTableFragments = cte ;
6871
6972 foreach ( var fragment in withTableFragments )
7073 {
74+ if ( cteFragmentsTranslated . Contains ( fragment ) )
75+ {
76+ continue ;
77+ }
78+
7179 if ( translatedQueryBuilder . Length == 0 )
7280 {
7381 translatedQueryBuilder . Append ( "WITH " ) ;
@@ -78,6 +86,8 @@ internal static string CompileQuery(
7886 }
7987
8088 translatedQueryBuilder . Append ( fragment . Translate ( queryExpressionTranslator ) ) ;
89+
90+ cteFragmentsTranslated . Add ( fragment ) ;
8191 }
8292
8393 if ( idx -- > 0 )
@@ -91,7 +101,7 @@ internal static string CompileQuery(
91101 }
92102 }
93103
94- var allFragments = query . Where ( f => cteList . Count == 0 || ! cteList . Contains ( f ) ) ;
104+ var allFragments = query . Where ( f => cteFragmentsTranslated . Count == 0 || ! cteFragmentsTranslated . Contains ( f ) ) ;
95105
96106 foreach ( var fragment in allFragments )
97107 {
0 commit comments