@@ -1084,7 +1084,38 @@ protected TReturn InternalToAggregate<TReturn>(Expression select)
10841084 var index = 0 ;
10851085
10861086 _commonExpression . ReadAnonymousField ( _tables , field , map , ref index , select , null , null , _whereGlobalFilter , null , null , false ) ; //不走 DTO 映射,不处理 IncludeMany
1087- return this . ToListMapReader < TReturn > ( new ReadAnonymousTypeAfInfo ( map , field . Length > 0 ? field . Remove ( 0 , 2 ) . ToString ( ) : null ) ) . FirstOrDefault ( ) ;
1087+ var af = new ReadAnonymousTypeAfInfo ( map , field . Length > 0 ? field . Remove ( 0 , 2 ) . ToString ( ) : null ) ;
1088+ if ( GetTableRuleUnions ( ) . Count <= 1 ) return this . ToListMapReader < TReturn > ( af ) . FirstOrDefault ( ) ;
1089+
1090+ var affield = af . field ;
1091+ var allMemExps = new FindAllMemberExpressionVisitor ( this ) ;
1092+ allMemExps . Visit ( select ) ;
1093+ field . Clear ( ) ;
1094+ var fieldAlias = new Dictionary < string , bool > ( ) ;
1095+ var fieldReplaced = new Dictionary < string , bool > ( ) ;
1096+ foreach ( var memExp in allMemExps . Result )
1097+ {
1098+ var gef = GetExpressionField ( memExp . Item1 , FieldAliasOptions . AsProperty ) ;
1099+ var geffield = gef . field ;
1100+ if ( fieldReplaced . ContainsKey ( geffield ) ) continue ;
1101+ fieldReplaced . Add ( geffield , true ) ;
1102+
1103+ field . Append ( ", " ) . Append ( gef . field ) ;
1104+ if ( fieldAlias . ContainsKey ( memExp . Item2 . Attribute . Name ) )
1105+ {
1106+ field . Append ( _commonUtils . FieldAsAlias ( $ "aas{ fieldAlias . Count } ") ) ;
1107+ affield = affield . Replace ( geffield , $ "ftba.aas{ fieldAlias . Count } ") ;
1108+ }
1109+ else
1110+ {
1111+ fieldAlias . Add ( memExp . Item2 . Attribute . Name , true ) ;
1112+ affield = affield . Replace ( geffield , $ "ftba.{ string . Join ( "." , geffield . Split ( '.' ) . Skip ( 1 ) ) } ") ;
1113+ }
1114+ }
1115+
1116+ var sql = this . ToSql ( field . Remove ( 0 , 2 ) . ToString ( ) ) ;
1117+ sql = $ "{ _select } { affield } FROM ( \r \n { sql . Replace ( "\r \n " , "\r \n " ) } \r \n ) ftba";
1118+ return ToListMrPrivate < TReturn > ( sql , af , null ) . FirstOrDefault ( ) ;
10881119 }
10891120 finally
10901121 {
@@ -1543,7 +1574,38 @@ async protected Task<TReturn> InternalToAggregateAsync<TReturn>(Expression selec
15431574 var index = 0 ;
15441575
15451576 _commonExpression . ReadAnonymousField ( _tables , field , map , ref index , select , null , null , _whereGlobalFilter , null , null , false ) ; //不走 DTO 映射,不处理 IncludeMany
1546- return ( await this . ToListMapReaderAsync < TReturn > ( new ReadAnonymousTypeAfInfo ( map , field . Length > 0 ? field . Remove ( 0 , 2 ) . ToString ( ) : null ) , cancellationToken ) ) . FirstOrDefault ( ) ;
1577+ var af = new ReadAnonymousTypeAfInfo ( map , field . Length > 0 ? field . Remove ( 0 , 2 ) . ToString ( ) : null ) ;
1578+ if ( GetTableRuleUnions ( ) . Count <= 1 ) return ( await this . ToListMapReaderAsync < TReturn > ( af , cancellationToken ) ) . FirstOrDefault ( ) ;
1579+
1580+ var affield = af . field ;
1581+ var allMemExps = new FindAllMemberExpressionVisitor ( this ) ;
1582+ allMemExps . Visit ( select ) ;
1583+ field . Clear ( ) ;
1584+ var fieldAlias = new Dictionary < string , bool > ( ) ;
1585+ var fieldReplaced = new Dictionary < string , bool > ( ) ;
1586+ foreach ( var memExp in allMemExps . Result )
1587+ {
1588+ var gef = GetExpressionField ( memExp . Item1 , FieldAliasOptions . AsProperty ) ;
1589+ var geffield = gef . field ;
1590+ if ( fieldReplaced . ContainsKey ( geffield ) ) continue ;
1591+ fieldReplaced . Add ( geffield , true ) ;
1592+
1593+ field . Append ( ", " ) . Append ( gef . field ) ;
1594+ if ( fieldAlias . ContainsKey ( memExp . Item2 . Attribute . Name ) )
1595+ {
1596+ field . Append ( _commonUtils . FieldAsAlias ( $ "aas{ fieldAlias . Count } ") ) ;
1597+ affield = affield . Replace ( geffield , $ "ftba.aas{ fieldAlias . Count } ") ;
1598+ }
1599+ else
1600+ {
1601+ fieldAlias . Add ( memExp . Item2 . Attribute . Name , true ) ;
1602+ affield = affield . Replace ( geffield , $ "ftba.{ string . Join ( "." , geffield . Split ( '.' ) . Skip ( 1 ) ) } ") ;
1603+ }
1604+ }
1605+
1606+ var sql = this . ToSql ( field . Remove ( 0 , 2 ) . ToString ( ) ) ;
1607+ sql = $ "{ _select } { affield } FROM ( \r \n { sql . Replace ( "\r \n " , "\r \n " ) } \r \n ) ftba";
1608+ return ( await ToListMrPrivateAsync < TReturn > ( sql , af , null , cancellationToken ) ) . FirstOrDefault ( ) ;
15471609 }
15481610 finally
15491611 {
0 commit comments