@ -1,9 +1,14 @@
using FreeSql.Internal.Mode l ;
using FreeSql.Extensions.EntityUti l ;
using FreeSql.Internal.Model ;
using System ;
using System.Collections ;
using System.Collections.Concurrent ;
using System.Collections.Generic ;
using System.Data ;
using System.Data.Common ;
using System.Linq ;
using System.Linq.Expressions ;
using System.Reflection ;
using System.Text ;
using System.Text.RegularExpressions ;
using System.Threading.Tasks ;
@ -64,7 +69,6 @@ namespace FreeSql.Internal.CommonProvider {
_tables [ 0 ] . Parameter = column . Parameters [ 0 ] ;
return this . InternalAvg < TMember > ( column ? . Body ) ;
}
public Task < TMember > AvgAsync < TMember > ( Expression < Func < T1 , TMember > > column ) {
if ( column = = null ) return Task . FromResult ( default ( TMember ) ) ;
_tables [ 0 ] . Parameter = column . Parameters [ 0 ] ;
@ -73,19 +77,12 @@ namespace FreeSql.Internal.CommonProvider {
public abstract ISelect < T1 , T2 > From < T2 > ( Expression < Func < ISelectFromExpression < T1 > , T2 , ISelectFromExpression < T1 > > > exp ) where T2 : class ; // { this.InternalFrom(exp?.Body); var ret = new Select3Provider<T1, T2, T3>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
public abstract ISelect < T1 , T2 , T3 > From < T2 , T3 > ( Expression < Func < ISelectFromExpression < T1 > , T2 , T3 , ISelectFromExpression < T1 > > > exp ) where T2 : class where T3 : class ; // { this.InternalFrom(exp?.Body); var ret = new Select3Provider<T1, T2, T3>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
public abstract ISelect < T1 , T2 , T3 , T4 > From < T2 , T3 , T4 > ( Expression < Func < ISelectFromExpression < T1 > , T2 , T3 , T4 , ISelectFromExpression < T1 > > > exp ) where T2 : class where T3 : class where T4 : class ; // { this.InternalFrom(exp?.Body); var ret = new Select4Provider<T1, T2, T3, T4>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
public abstract ISelect < T1 , T2 , T3 , T4 , T5 > From < T2 , T3 , T4 , T5 > ( Expression < Func < ISelectFromExpression < T1 > , T2 , T3 , T4 , T5 , ISelectFromExpression < T1 > > > exp ) where T2 : class where T3 : class where T4 : class where T5 : class ; // { this.InternalFrom(exp?.Body); var ret = new Select5Provider<T1, T2, T3, T4, T5>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
public abstract ISelect < T1 , T2 , T3 , T4 , T5 , T6 > From < T2 , T3 , T4 , T5 , T6 > ( Expression < Func < ISelectFromExpression < T1 > , T2 , T3 , T4 , T5 , T6 , ISelectFromExpression < T1 > > > exp ) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class ; // { this.InternalFrom(exp?.Body); var ret = new Select6Provider<T1, T2, T3, T4, T5, T6>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
public abstract ISelect < T1 , T2 , T3 , T4 , T5 , T6 , T7 > From < T2 , T3 , T4 , T5 , T6 , T7 > ( Expression < Func < ISelectFromExpression < T1 > , T2 , T3 , T4 , T5 , T6 , T7 , ISelectFromExpression < T1 > > > exp ) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class ; // { this.InternalFrom(exp?.Body); var ret = new Select7Provider<T1, T2, T3, T4, T5, T6, T7>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
public abstract ISelect < T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 > From < T2 , T3 , T4 , T5 , T6 , T7 , T8 > ( Expression < Func < ISelectFromExpression < T1 > , T2 , T3 , T4 , T5 , T6 , T7 , T8 , ISelectFromExpression < T1 > > > exp ) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class ; // { this.InternalFrom(exp?.Body); var ret = new Select8Provider<T1, T2, T3, T4, T5, T6, T7, T8>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
public abstract ISelect < T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 > From < T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 > ( Expression < Func < ISelectFromExpression < T1 > , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , ISelectFromExpression < T1 > > > exp ) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class ; // { this.InternalFrom(exp?.Body); var ret = new Select9Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
public abstract ISelect < T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 > From < T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 > ( Expression < Func < ISelectFromExpression < T1 > , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , ISelectFromExpression < T1 > > > exp ) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class ; // { this.InternalFrom(exp?.Body); var ret = new Select10Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(_orm, _commonUtils, _commonExpression, null); Select0Provider<ISelect<T1>, T1>.CopyData(this, ret, exp?.Parameters); return ret; }
public ISelectGrouping < TKey , T1 > GroupBy < TKey > ( Expression < Func < T1 , TKey > > columns ) {
@ -99,7 +96,6 @@ namespace FreeSql.Internal.CommonProvider {
_tables [ 0 ] . Parameter = column . Parameters [ 0 ] ;
return this . InternalMax < TMember > ( column ? . Body ) ;
}
public Task < TMember > MaxAsync < TMember > ( Expression < Func < T1 , TMember > > column ) {
if ( column = = null ) return Task . FromResult ( default ( TMember ) ) ;
_tables [ 0 ] . Parameter = column . Parameters [ 0 ] ;
@ -111,7 +107,6 @@ namespace FreeSql.Internal.CommonProvider {
_tables [ 0 ] . Parameter = column . Parameters [ 0 ] ;
return this . InternalMin < TMember > ( column ? . Body ) ;
}
public Task < TMember > MinAsync < TMember > ( Expression < Func < T1 , TMember > > column ) {
if ( column = = null ) return Task . FromResult ( default ( TMember ) ) ;
_tables [ 0 ] . Parameter = column . Parameters [ 0 ] ;
@ -123,7 +118,6 @@ namespace FreeSql.Internal.CommonProvider {
_tables [ 0 ] . Parameter = column . Parameters [ 0 ] ;
return this . InternalOrderBy ( column ? . Body ) ;
}
public ISelect < T1 > OrderByDescending < TMember > ( Expression < Func < T1 , TMember > > column ) {
if ( column = = null ) return this ;
_tables [ 0 ] . Parameter = column . Parameters [ 0 ] ;
@ -135,7 +129,6 @@ namespace FreeSql.Internal.CommonProvider {
_tables [ 0 ] . Parameter = column . Parameters [ 0 ] ;
return this . InternalSum < TMember > ( column ? . Body ) ;
}
public Task < TMember > SumAsync < TMember > ( Expression < Func < T1 , TMember > > column ) {
if ( column = = null ) return Task . FromResult ( default ( TMember ) ) ;
_tables [ 0 ] . Parameter = column . Parameters [ 0 ] ;
@ -152,8 +145,8 @@ namespace FreeSql.Internal.CommonProvider {
_tables [ 0 ] . Parameter = select . Parameters [ 0 ] ;
return this . InternalToListAsync < TReturn > ( select ? . Body ) ;
}
List < TDto > ISelect < T1 > . ToList < TDto > ( ) = > ToList ( GetToListDtoSelector < TDto > ( ) ) ;
Task < List < TDto > > ISelect < T1 > . ToListAsync < TDto > ( ) = > ToListAsync ( GetToListDtoSelector < TDto > ( ) ) ;
public List < TDto > ToList < TDto > ( ) = > ToList ( GetToListDtoSelector < TDto > ( ) ) ;
public Task < List < TDto > > ToListAsync < TDto > ( ) = > ToListAsync ( GetToListDtoSelector < TDto > ( ) ) ;
Expression < Func < T1 , TDto > > GetToListDtoSelector < TDto > ( ) {
var ctor = typeof ( TDto ) . GetConstructor ( new Type [ 0 ] ) ;
return Expression . Lambda < Func < T1 , TDto > > ( Expression . New ( ctor ) ,
@ -310,5 +303,259 @@ namespace FreeSql.Internal.CommonProvider {
public TReturn First < TReturn > ( Expression < Func < T1 , TReturn > > select ) = > this . ToOne ( select ) ;
public Task < TReturn > FirstAsync < TReturn > ( Expression < Func < T1 , TReturn > > select ) = > this . ToOneAsync ( select ) ;
public ISelect < T1 > Include < TNavigate > ( Expression < Func < T1 , TNavigate > > navigateSelector ) where TNavigate : class {
var expBody = navigateSelector ? . Body ;
if ( expBody = = null ) return this ;
var tb = _commonUtils . GetTableByEntity ( expBody . Type ) ;
if ( tb = = null ) throw new Exception ( "Include 参数类型错误" ) ;
_commonExpression . ExpressionWhereLambda ( _tables , Expression . MakeMemberAccess ( expBody , tb . Properties [ tb . ColumnsByCs . First ( ) . Value . CsName ] ) , null ) ;
return this ;
}
static MethodInfo GetEntityValueWithPropertyNameMethod = typeof ( EntityUtilExtensions ) . GetMethod ( "GetEntityValueWithPropertyName" ) ;
static ConcurrentDictionary < Type , ConcurrentDictionary < string , MethodInfo > > _dicTypeMethod = new ConcurrentDictionary < Type , ConcurrentDictionary < string , MethodInfo > > ( ) ;
public ISelect < T1 > IncludeMany < TNavigate > ( Expression < Func < T1 , ICollection < TNavigate > > > navigateSelector , Action < ISelect < TNavigate > > then = null ) where TNavigate : class {
var expBody = navigateSelector ? . Body ;
if ( expBody = = null ) return this ;
if ( expBody . NodeType ! = ExpressionType . MemberAccess ) throw new Exception ( "IncludeMany 参数1 类型错误,表达式类型应该为 MemberAccess" ) ;
var collMem = expBody as MemberExpression ;
Expression tmpExp = collMem . Expression ;
var members = new Stack < MemberInfo > ( ) ;
var isbreak = false ;
while ( isbreak = = false ) {
switch ( tmpExp . NodeType ) {
case ExpressionType . MemberAccess :
var memExp = tmpExp as MemberExpression ;
tmpExp = memExp . Expression ;
members . Push ( memExp . Member ) ;
continue ;
case ExpressionType . Parameter :
isbreak = true ;
break ;
default :
throw new Exception ( "IncludeMany 参数1 类型错误" ) ;
}
}
var tb = _commonUtils . GetTableByEntity ( collMem . Expression . Type ) ;
if ( tb = = null ) throw new Exception ( "IncludeMany 参数1 类型错误" ) ;
if ( collMem . Expression . NodeType ! = ExpressionType . Parameter )
_commonExpression . ExpressionWhereLambda ( _tables , Expression . MakeMemberAccess ( collMem . Expression , tb . Properties [ tb . ColumnsByCs . First ( ) . Value . CsName ] ) , null ) ;
var tbref = tb . GetTableRef ( collMem . Member . Name , true ) ;
_includeToList . Enqueue ( listObj = > {
var list = listObj as List < T1 > ;
if ( list = = null ) return ;
if ( list . Any ( ) = = false ) return ;
var t1parm = Expression . Parameter ( typeof ( T1 ) ) ;
Expression membersExp = t1parm ;
while ( members . Any ( ) ) membersExp = Expression . MakeMemberAccess ( membersExp , members . Pop ( ) ) ;
var listValueExp = Expression . Parameter ( typeof ( List < TNavigate > ) , "listValue" ) ;
var setListValue = Expression . Lambda < Action < T1 , List < TNavigate > > > (
Expression . Assign (
Expression . MakeMemberAccess ( membersExp , collMem . Member ) ,
Expression . TypeAs ( listValueExp , collMem . Type )
) , t1parm , listValueExp ) . Compile ( ) ;
var returnTarget = Expression . Label ( typeof ( object ) ) ;
var propertyNameExp = Expression . Parameter ( typeof ( string ) , "propertyName" ) ;
var getListValue = Expression . Lambda < Func < T1 , string , object > > (
Expression . Block (
Expression . Return ( returnTarget , Expression . Call ( null , GetEntityValueWithPropertyNameMethod , Expression . Constant ( _orm ) , Expression . Constant ( membersExp . Type ) , membersExp , propertyNameExp ) ) ,
Expression . Label ( returnTarget , Expression . Default ( typeof ( object ) ) )
) , t1parm , propertyNameExp ) . Compile ( ) ;
foreach ( var item in list ) {
setListValue ( item , null ) ;
}
var subSelect = _orm . Select < TNavigate > ( ) . WithConnection ( _connection ) . WithTransaction ( _transaction ) . TrackToList ( _trackToList ) ;
if ( _tableRules ? . Any ( ) = = true )
foreach ( var tr in _tableRules ) subSelect . AsTable ( tr ) ;
switch ( tbref . RefType ) {
case TableRefType . OneToMany :
if ( true ) {
var tbref2 = _commonUtils . GetTableByEntity ( tbref . RefEntityType ) ;
if ( tbref . Columns . Count = = 1 ) {
var arrExp = Expression . NewArrayInit ( tbref . Columns [ 0 ] . CsType , list . Select ( a = > Expression . Constant ( Convert . ChangeType ( getListValue ( a , tbref . Columns [ 0 ] . CsName ) , tbref . Columns [ 0 ] . CsType ) ) ) . ToArray ( ) ) ;
var otmExpParm1 = Expression . Parameter ( typeof ( TNavigate ) , "a" ) ;
var containsMethod = _dicTypeMethod . GetOrAdd ( tbref . Columns [ 0 ] . CsType , et = > new ConcurrentDictionary < string , MethodInfo > ( ) ) . GetOrAdd ( "Contains" , mn = >
typeof ( Enumerable ) . GetMethods ( ) . Where ( a = > a . Name = = mn ) . First ( ) ) . MakeGenericMethod ( tbref . Columns [ 0 ] . CsType ) ;
var refCol = Expression . MakeMemberAccess ( otmExpParm1 , tbref2 . Properties [ tbref . RefColumns [ 0 ] . CsName ] ) ;
if ( refCol . Type . IsNullableType ( ) ) refCol = Expression . Property ( refCol , CommonExpression . _dicNullableValueProperty . GetOrAdd ( refCol . Type , ct1 = > ct1 . GetProperty ( "Value" ) ) ) ;
subSelect . Where ( Expression . Lambda < Func < TNavigate , bool > > (
Expression . Call ( null , containsMethod , arrExp , refCol ) , otmExpParm1 ) ) ;
} else {
var otmExpParm1 = Expression . Parameter ( typeof ( TNavigate ) , "a" ) ;
Expression expOr = null ;
foreach ( var item in list ) {
Expression expAnd = null ;
for ( var z = 0 ; z < tbref . Columns . Count ; z + + ) {
var colVal = getListValue ( item , tbref . Columns [ z ] . CsName ) ;
var expTmp = Expression . Equal ( Expression . MakeMemberAccess ( otmExpParm1 , tbref2 . Properties [ tbref . RefColumns [ 0 ] . CsName ] ) , Expression . Constant ( colVal ) ) ;
if ( z = = 0 ) expAnd = expTmp ;
else expAnd = Expression . AndAlso ( expAnd , expTmp ) ;
}
if ( expOr = = null ) expOr = expAnd ;
else expOr = Expression . OrElse ( expOr , expAnd ) ;
}
subSelect . Where ( Expression . Lambda < Func < TNavigate , bool > > ( expOr , otmExpParm1 ) ) ;
}
then ? . Invoke ( subSelect ) ;
var subList = subSelect . ToList ( true ) ;
if ( subList . Any ( ) = = false ) {
foreach ( var item in list )
setListValue ( item , new List < TNavigate > ( ) ) ;
return ;
}
Dictionary < string , Tuple < T1 , List < TNavigate > > > dicList = new Dictionary < string , Tuple < T1 , List < TNavigate > > > ( ) ;
foreach ( var item in list ) {
if ( tbref . Columns . Count = = 1 ) {
dicList . Add ( getListValue ( item , tbref . Columns [ 0 ] . CsName ) . ToString ( ) , Tuple . Create ( item , new List < TNavigate > ( ) ) ) ;
} else {
var sb = new StringBuilder ( ) ;
for ( var z = 0 ; z < tbref . Columns . Count ; z + + ) {
if ( z > 0 ) sb . Append ( "*$*" ) ;
sb . Append ( getListValue ( item , tbref . Columns [ z ] . CsName ) ) ;
}
dicList . Add ( sb . Remove ( 0 , 3 ) . ToString ( ) , Tuple . Create ( item , new List < TNavigate > ( ) ) ) ;
sb . Clear ( ) ;
}
}
var parentNavs = new List < string > ( ) ;
foreach ( var navProp in tbref2 . Properties ) {
if ( tbref2 . ColumnsByCs . ContainsKey ( navProp . Key ) ) continue ;
if ( tbref2 . ColumnsByCsIgnore . ContainsKey ( navProp . Key ) ) continue ;
var tr2ref = tbref2 . GetTableRef ( navProp . Key , false ) ;
if ( tr2ref = = null ) continue ;
if ( tr2ref . RefType ! = TableRefType . ManyToOne ) continue ;
if ( tr2ref . RefEntityType ! = tb . Type ) continue ;
parentNavs . Add ( navProp . Key ) ;
}
foreach ( var nav in subList ) {
string key = null ;
if ( tbref . RefColumns . Count = = 1 ) {
key = _orm . GetEntityValueWithPropertyName ( tbref . RefEntityType , nav , tbref . RefColumns [ 0 ] . CsName ) . ToString ( ) ;
} else {
var sb = new StringBuilder ( ) ;
for ( var z = 0 ; z < tbref . RefColumns . Count ; z + + ) {
if ( z > 0 ) sb . Append ( "*$*" ) ;
sb . Append ( _orm . GetEntityValueWithPropertyName ( tbref . RefEntityType , nav , tbref . RefColumns [ z ] . CsName ) ) ;
}
key = sb . ToString ( ) ;
sb . Clear ( ) ;
}
if ( dicList . TryGetValue ( key , out var t1item ) = = false ) return ;
t1item . Item2 . Add ( nav ) ;
//将子集合的,多对一,对象设置为当前对象
foreach ( var parentNav in parentNavs )
_orm . SetEntityValueWithPropertyName ( tbref . RefMiddleEntityType , nav , parentNav , t1item . Item1 ) ;
}
foreach ( var t1item in dicList . Values )
setListValue ( t1item . Item1 , t1item . Item2 ) ;
dicList . Clear ( ) ;
}
break ;
case TableRefType . ManyToMany :
if ( true ) {
var tbref2 = _commonUtils . GetTableByEntity ( tbref . RefEntityType ) ;
var tbrefMid = _commonUtils . GetTableByEntity ( tbref . RefMiddleEntityType ) ;
if ( tbref . Columns . Count = = 1 ) {
//var midParmExp = Expression.Parameter(tbref.RefMiddleEntityType, "midtb");
//(subSelect as Select1Provider<TNavigate>)._tables.Add(new SelectTableInfo {
// Alias = "midtb",
// AliasInit = "midtb",
// On = $"{_commonUtils.QuoteSqlName(tbrefMid.DbName)} midtb ON midtb.{_commonUtils.QuoteSqlName(tbref.MiddleColumns[1].Attribute.Name)} = a.{_commonUtils.QuoteSqlName(tbref.RefColumns[0].Attribute.Name)}",
// Parameter = midParmExp,
// Table = tbrefMid,
// Type = SelectTableInfoType.InnerJoin
//});
subSelect . InnerJoin ( $"{_commonUtils.QuoteSqlName(tbrefMid.DbName)} midtb ON midtb.{_commonUtils.QuoteSqlName(tbref.MiddleColumns[1].Attribute.Name)} = a.{_commonUtils.QuoteSqlName(tbref.RefColumns[0].Attribute.Name)}" ) ;
subSelect . Where ( _commonUtils . FormatSql ( $"midtb.{_commonUtils.QuoteSqlName(tbref.MiddleColumns[0].Attribute.Name)} in {{0}}" , list . Select ( a = > getListValue ( a , tbref . Columns [ 0 ] . CsName ) ) ) ) ;
} else {
}
then ? . Invoke ( subSelect ) ;
List < TNavigate > subList = null ;
List < object > midList = new List < object > ( ) ;
var subSelectP1 = ( subSelect as Select1Provider < TNavigate > ) ;
var af = subSelectP1 . GetAllFieldExpressionTreeLevelAll ( ) ;
if ( _selectExpression = = null ) { // return this.InternalToList<T1>(_selectExpression).Select(a => (a, ()).ToList();
var sb = new StringBuilder ( ) . Append ( af . Field ) ;
var read = new ReadAnonymousTypeInfo ( ) ;
read . ConsturctorType = ReadAnonymousTypeInfoConsturctorType . Properties ;
read . Consturctor = tbrefMid . TypeLazy . GetConstructor ( new Type [ 0 ] ) ;
read . Table = tbrefMid ;
foreach ( var col in tbrefMid . Columns . Values ) {
if ( tbref . MiddleColumns . Where ( a = > a . CsName = = col . CsName ) . Any ( ) = = false ) continue ;
var child = new ReadAnonymousTypeInfo {
CsName = col . CsName ,
CsType = col . CsType ,
DbField = $"midtb.{_commonUtils.QuoteSqlName(col.Attribute.Name)}" ,
MapType = col . Attribute . MapType ,
Property = tbrefMid . Properties [ col . CsName ]
} ;
read . Childs . Add ( child ) ;
sb . Append ( ", " ) . Append ( _commonUtils . QuoteReadColumn ( child . MapType , child . DbField ) ) ;
}
af . Field = sb . ToString ( ) ;
subList = subSelectP1 . ToListPrivate ( af , new [ ] { ( read , midList ) } ) ;
} else
subList = subSelectP1 . ToListPrivate ( af , null ) ;
if ( subList . Any ( ) = = false ) {
foreach ( var item in list )
setListValue ( item , new List < TNavigate > ( ) ) ;
return ;
}
Dictionary < string , Tuple < T1 , List < TNavigate > > > dicList = new Dictionary < string , Tuple < T1 , List < TNavigate > > > ( ) ;
foreach ( var item in list ) {
if ( tbref . Columns . Count = = 1 ) {
dicList . Add ( getListValue ( item , tbref . Columns [ 0 ] . CsName ) . ToString ( ) , Tuple . Create ( item , new List < TNavigate > ( ) ) ) ;
} else {
var sb = new StringBuilder ( ) ;
for ( var z = 0 ; z < tbref . Columns . Count ; z + + ) {
if ( z > 0 ) sb . Append ( "*$*" ) ;
sb . Append ( getListValue ( item , tbref . Columns [ z ] . CsName ) ) ;
}
dicList . Add ( sb . Remove ( 0 , 3 ) . ToString ( ) , Tuple . Create ( item , new List < TNavigate > ( ) ) ) ;
sb . Clear ( ) ;
}
}
for ( var a = 0 ; a < subList . Count ; a + + ) {
string key = null ;
if ( tbref . Columns . Count = = 1 ) {
key = _orm . GetEntityValueWithPropertyName ( tbref . RefMiddleEntityType , midList [ a ] , tbref . MiddleColumns [ 0 ] . CsName ) . ToString ( ) ;
} else {
var sb = new StringBuilder ( ) ;
for ( var z = 0 ; z < tbref . Columns . Count ; z + + ) {
if ( z > 0 ) sb . Append ( "*$*" ) ;
sb . Append ( _orm . GetEntityValueWithPropertyName ( tbref . RefMiddleEntityType , midList [ a ] , tbref . MiddleColumns [ z ] . CsName ) ) ;
}
key = sb . ToString ( ) ;
sb . Clear ( ) ;
}
if ( dicList . TryGetValue ( key , out var t1item ) = = false ) return ;
t1item . Item2 . Add ( subList [ a ] ) ;
}
foreach ( var t1item in dicList . Values )
setListValue ( t1item . Item1 , t1item . Item2 ) ;
dicList . Clear ( ) ;
}
break ;
}
} ) ;
return this ;
}
}
}