2022-04-11 14:04:22 +08:00
using System ;
2022-04-11 20:54:20 +08:00
using System.Collections ;
2022-04-11 14:04:22 +08:00
using System.Collections.Generic ;
using System.Linq ;
using System.Linq.Expressions ;
using System.Text ;
using System.Threading.Tasks ;
namespace SqlSugar
{
public class NavigatManager < T >
{
public SqlSugarProvider Context { get ; set ; }
2022-04-11 20:54:20 +08:00
public Func < ISugarQueryable < object > , List < object > > SelectR1 { get ; set ; }
public Func < ISugarQueryable < object > , List < object > > SelectR2 { get ; set ; }
public Func < ISugarQueryable < object > , List < object > > SelectR3 { get ; set ; }
public Func < ISugarQueryable < object > , List < object > > SelectR4 { get ; set ; }
public Func < ISugarQueryable < object > , List < object > > SelectR5 { get ; set ; }
public Func < ISugarQueryable < object > , List < object > > SelectR6 { get ; set ; }
public Func < ISugarQueryable < object > , List < object > > SelectR7 { get ; set ; }
public Func < ISugarQueryable < object > , List < object > > SelectR8 { get ; set ; }
2022-04-11 14:04:22 +08:00
public Expression [ ] Expressions { get ; set ; }
public List < T > RootList { get ; set ; }
//public QueryableProvider<T> Queryable { get; set; }
2022-04-11 21:19:51 +08:00
private List < Expression > _preExpressionList = new List < Expression > ( ) ;
2022-04-12 01:30:21 +08:00
private List < object > _preList = new List < object > ( ) ;
2022-04-13 20:50:17 +08:00
private List < Expression > _ListCallFunc ;
2022-04-11 14:04:22 +08:00
//private Expression[] _expressions;
//private List<T> _list;
//private EntityInfo _entityInfo;
public void Execute ( )
{
2022-04-11 20:54:20 +08:00
var i = 1 ;
foreach ( var item in Expressions )
2022-04-11 14:04:22 +08:00
{
2022-04-11 20:54:20 +08:00
ExecuteByLay ( i , item ) ;
i + + ;
}
}
2022-04-11 14:04:22 +08:00
2022-04-11 20:54:20 +08:00
private void ExecuteByLay ( int i , Expression item )
{
2022-04-13 20:50:17 +08:00
_ListCallFunc = GetWhereExpression ( ref item ) ;
2022-04-11 20:54:20 +08:00
if ( i = = 1 )
{
ExecuteByLay ( item , RootList . Select ( it = > it as object ) . ToList ( ) , SelectR1 ) ;
2022-04-11 14:04:22 +08:00
}
2022-04-12 00:14:35 +08:00
else if ( i = = 2 )
2022-04-11 21:19:51 +08:00
{
2022-04-12 01:30:21 +08:00
var currentList = RootList ;
if ( RootList = = null | | currentList . Count = = 0 ) return ;
2022-04-11 21:19:51 +08:00
var memberExpression = ( ( _preExpressionList . Last ( ) as LambdaExpression ) . Body as MemberExpression ) ;
var navObjectName = memberExpression . Member . Name ;
2022-04-12 01:30:21 +08:00
var navType = currentList [ 0 ] . GetType ( ) . GetProperty ( navObjectName ) . PropertyType . Name ;
var isList = navType . StartsWith ( "List`" ) ;
List < object > list = new List < object > ( ) ;
if ( isList )
{
list = currentList . SelectMany ( it = > ( it . GetType ( ) . GetProperty ( navObjectName ) . GetValue ( it ) as IList ) . Cast < object > ( ) ) . ToList ( ) ;
}
else
{
list = currentList . Select ( it = > ( it . GetType ( ) . GetProperty ( navObjectName ) . GetValue ( it ) ) ) . ToList ( ) ;
}
2022-04-11 21:19:51 +08:00
ExecuteByLay ( item , list , SelectR2 ) ;
2022-04-12 01:30:21 +08:00
_preList = list ;
}
else if ( i = = 3 )
{
2022-04-12 01:43:08 +08:00
var currentList = _preList . Where ( it = > it ! = null ) . ToList ( ) ;
2022-04-12 01:30:21 +08:00
if ( RootList = = null | | currentList . Count = = 0 ) return ;
2022-04-15 14:58:18 +08:00
List < object > list = ExecuteByLay ( currentList ) ;
2022-04-12 01:30:21 +08:00
ExecuteByLay ( item , list , SelectR3 ) ;
2022-04-12 01:43:08 +08:00
_preList = list . ToList ( ) ;
2022-04-11 21:19:51 +08:00
}
2022-04-15 14:59:25 +08:00
else if ( i = = 4 )
{
var currentList = _preList . Where ( it = > it ! = null ) . ToList ( ) ;
if ( RootList = = null | | currentList . Count = = 0 ) return ;
List < object > list = ExecuteByLay ( currentList ) ;
ExecuteByLay ( item , list , SelectR4 ) ;
_preList = list . ToList ( ) ;
}
else if ( i = = 5 )
{
var currentList = _preList . Where ( it = > it ! = null ) . ToList ( ) ;
if ( RootList = = null | | currentList . Count = = 0 ) return ;
List < object > list = ExecuteByLay ( currentList ) ;
ExecuteByLay ( item , list , SelectR5 ) ;
_preList = list . ToList ( ) ;
}
else if ( i = = 6 )
{
var currentList = _preList . Where ( it = > it ! = null ) . ToList ( ) ;
if ( RootList = = null | | currentList . Count = = 0 ) return ;
List < object > list = ExecuteByLay ( currentList ) ;
ExecuteByLay ( item , list , SelectR6 ) ;
_preList = list . ToList ( ) ;
}
else if ( i = = 7 )
{
var currentList = _preList . Where ( it = > it ! = null ) . ToList ( ) ;
if ( RootList = = null | | currentList . Count = = 0 ) return ;
List < object > list = ExecuteByLay ( currentList ) ;
ExecuteByLay ( item , list , SelectR7 ) ;
_preList = list . ToList ( ) ;
}
2022-04-11 21:19:51 +08:00
_preExpressionList . Add ( item ) ;
2022-04-13 20:50:17 +08:00
_ListCallFunc = new List < Expression > ( ) ;
2022-04-11 14:04:22 +08:00
}
2022-04-15 14:58:18 +08:00
private List < object > ExecuteByLay ( List < object > currentList )
{
var memberExpression = ( ( _preExpressionList . Last ( ) as LambdaExpression ) . Body as MemberExpression ) ;
var navObjectName = memberExpression . Member . Name ;
var navType = currentList [ 0 ] . GetType ( ) . GetProperty ( navObjectName ) . PropertyType . Name ;
var isList = navType . StartsWith ( "List`" ) ;
List < object > list = new List < object > ( ) ;
if ( isList )
{
list = currentList . SelectMany ( it = > ( it . GetType ( ) . GetProperty ( navObjectName ) . GetValue ( it ) as IList ) . Cast < object > ( ) ) . ToList ( ) ;
}
else
{
list = currentList . Select ( it = > ( it . GetType ( ) . GetProperty ( navObjectName ) . GetValue ( it ) ) ) . ToList ( ) ;
}
return list ;
}
2022-04-11 20:54:20 +08:00
private void ExecuteByLay ( Expression expression , List < object > list , Func < ISugarQueryable < object > , List < object > > selector )
{
if ( list = = null | | list . Count = = 0 ) return ;
2022-04-12 01:30:21 +08:00
list = list . Where ( it = > it ! = null ) . ToList ( ) ;
2022-04-11 20:54:20 +08:00
var memberExpression = ( ( expression as LambdaExpression ) . Body as MemberExpression ) ;
2022-04-12 01:30:21 +08:00
var listItemType = list . Where ( it = > it ! = null ) . FirstOrDefault ( ) ? . GetType ( ) ;
if ( listItemType . Name . StartsWith ( "List`" ) )
{
listItemType = listItemType . GetGenericArguments ( ) [ 0 ] ;
}
if ( listItemType = = null ) return ;
2022-04-11 20:54:20 +08:00
var listItemEntity = this . Context . EntityMaintenance . GetEntityInfo ( listItemType ) ;
var listPkColumn = listItemEntity . Columns . Where ( it = > it . IsPrimarykey ) . FirstOrDefault ( ) ;
var navObjectName = memberExpression . Member . Name ;
var navObjectNamePropety = listItemType . GetProperty ( navObjectName ) ;
var navObjectNameColumnInfo = listItemEntity . Columns . First ( it = > it . PropertyName = = navObjectName ) ;
Check . ExceptionEasy ( navObjectNameColumnInfo . Navigat = = null , $"{navObjectName} not [Navigat(..)] " , $"{navObjectName} 没有导航特性 [Navigat(..)] " ) ;
2022-04-14 12:53:53 +08:00
if ( navObjectNameColumnInfo . Navigat . NavigatType = = NavigateType . OneToOne )
2022-04-11 20:54:20 +08:00
{
OneToOne ( list , selector , listItemEntity , navObjectNamePropety , navObjectNameColumnInfo ) ;
}
2022-04-14 12:53:53 +08:00
else if ( navObjectNameColumnInfo . Navigat . NavigatType = = NavigateType . OneToMany )
2022-04-11 20:54:20 +08:00
{
OneToMany ( list , selector , listItemEntity , navObjectNamePropety , navObjectNameColumnInfo ) ;
}
2022-04-14 12:53:53 +08:00
else if ( navObjectNameColumnInfo . Navigat . NavigatType = = NavigateType . ManyToOne )
2022-04-11 20:54:20 +08:00
{
2022-04-12 00:27:34 +08:00
OneToOne ( list , selector , listItemEntity , navObjectNamePropety , navObjectNameColumnInfo ) ;
2022-04-11 20:54:20 +08:00
}
else
{
2022-04-11 21:19:51 +08:00
ManyToMany ( list , selector , listItemEntity , navObjectNamePropety , navObjectNameColumnInfo ) ;
2022-04-11 20:54:20 +08:00
}
}
2022-04-13 20:50:17 +08:00
private List < Expression > GetWhereExpression ( ref Expression expression )
{
List < Expression > expressions = new List < Expression > ( ) ;
var isCall = ( expression as LambdaExpression ) . Body is MethodCallExpression ;
if ( isCall )
{
var newexp = ( expression as LambdaExpression ) . Body ;
while ( newexp is MethodCallExpression )
{
expressions . Add ( newexp ) ;
newexp = ( newexp as MethodCallExpression ) . Arguments [ 0 ] ;
}
expression = LambdaExpression . Lambda ( newexp ) ;
}
return expressions ;
}
2022-04-11 21:19:51 +08:00
private void ManyToMany ( List < object > list , Func < ISugarQueryable < object > , List < object > > selector , EntityInfo listItemEntity , System . Reflection . PropertyInfo navObjectNamePropety , EntityColumnInfo navObjectNameColumnInfo )
{
2022-04-11 22:38:53 +08:00
var bEntity = navObjectNameColumnInfo . PropertyInfo . PropertyType . GetGenericArguments ( ) [ 0 ] ;
var bEntityInfo = this . Context . EntityMaintenance . GetEntityInfo ( bEntity ) ;
2022-04-12 00:27:34 +08:00
var bPkColumn = bEntityInfo . Columns . FirstOrDefault ( it = > it . IsPrimarykey ) ;
2022-04-11 21:19:51 +08:00
2022-04-11 22:38:53 +08:00
var listItemPkColumn = listItemEntity . Columns . Where ( it = > it . IsPrimarykey ) . FirstOrDefault ( ) ;
var ids = list . Select ( it = > it . GetType ( ) . GetProperty ( listItemPkColumn . PropertyName ) . GetValue ( it ) ) . Select ( it = > it = = null ? "null" : it ) . Distinct ( ) . ToList ( ) ;
var mappingEntity = this . Context . EntityMaintenance . GetEntityInfo ( navObjectNameColumnInfo . Navigat . MappingType ) ;
var aColumn = mappingEntity . Columns . First ( it = > it . PropertyName = = navObjectNameColumnInfo . Navigat . MappingAId ) ;
var bColumn = mappingEntity . Columns . First ( it = > it . PropertyName = = navObjectNameColumnInfo . Navigat . MappingBId ) ;
List < IConditionalModel > conditionalModels = new List < IConditionalModel > ( ) ;
conditionalModels . Add ( ( new ConditionalModel ( )
{
ConditionalType = ConditionalType . In ,
FieldName = aColumn . DbColumnName ,
FieldValue = String . Join ( "," , ids ) ,
2022-04-12 00:14:35 +08:00
CSharpTypeName = aColumn . PropertyInfo . PropertyType . Name
2022-04-11 22:38:53 +08:00
} ) ) ;
2022-04-12 00:14:35 +08:00
var abids = this . Context . Queryable < object > ( ) . AS ( mappingEntity . DbTableName ) . Where ( conditionalModels ) . Select < SugarAbMapping > ( $"{aColumn.DbColumnName} as aid,{bColumn.DbColumnName} as bid" ) . ToList ( ) ;
2022-04-11 22:38:53 +08:00
List < IConditionalModel > conditionalModels2 = new List < IConditionalModel > ( ) ;
conditionalModels2 . Add ( ( new ConditionalModel ( )
{
ConditionalType = ConditionalType . In ,
2022-04-12 00:27:34 +08:00
FieldName = bPkColumn . DbColumnName ,
2022-04-12 00:14:35 +08:00
FieldValue = String . Join ( "," , abids . Select ( it = > it . Bid ) . ToArray ( ) ) ,
2022-04-11 22:38:53 +08:00
CSharpTypeName = bColumn . PropertyInfo . PropertyType . Name
} ) ) ;
2022-04-13 20:50:17 +08:00
var sql = GetWhereSql ( ) ;
2022-04-18 15:17:11 +08:00
var bList = selector ( this . Context . Queryable < object > ( ) . AS ( bEntityInfo . DbTableName ) . AddParameters ( sql . Parameters ) . Where ( conditionalModels2 ) . WhereIF ( sql . WhereString . HasValue ( ) , sql . WhereString ) . Select ( sql . SelectString ) . OrderByIF ( sql . OrderByString . HasValue ( ) , sql . OrderByString ) ) ;
2022-04-12 00:27:34 +08:00
if ( bList . HasValue ( ) )
2022-04-11 22:38:53 +08:00
{
2022-04-12 00:27:34 +08:00
foreach ( var listItem in list )
2022-04-11 22:38:53 +08:00
{
2022-04-18 12:04:35 +08:00
if ( navObjectNamePropety . GetValue ( listItem ) = = null )
2022-04-11 22:38:53 +08:00
{
2022-04-18 12:04:35 +08:00
var instance = Activator . CreateInstance ( navObjectNamePropety . PropertyType , true ) ;
var ilist = instance as IList ;
foreach ( var bInfo in bList )
2022-04-12 00:14:35 +08:00
{
2022-04-18 12:04:35 +08:00
var pk = listItemPkColumn . PropertyInfo . GetValue ( listItem ) . ObjToString ( ) ;
var bid = bPkColumn . PropertyInfo . GetValue ( bInfo ) . ObjToString ( ) ;
if ( abids . Any ( x = > x . Aid = = pk & & x . Bid = = bid ) )
{
2022-04-12 00:27:34 +08:00
ilist . Add ( bInfo ) ;
2022-04-18 12:04:35 +08:00
}
2022-04-12 00:14:35 +08:00
}
2022-04-18 12:04:35 +08:00
navObjectNamePropety . SetValue ( listItem , instance ) ;
2022-04-11 22:38:53 +08:00
}
}
}
2022-04-11 21:19:51 +08:00
}
2022-04-11 20:54:20 +08:00
private void OneToOne ( List < object > list , Func < ISugarQueryable < object > , List < object > > selector , EntityInfo listItemEntity , System . Reflection . PropertyInfo navObjectNamePropety , EntityColumnInfo navObjectNameColumnInfo )
{
var navColumn = listItemEntity . Columns . FirstOrDefault ( it = > it . PropertyName = = navObjectNameColumnInfo . Navigat . Name ) ;
var navType = navObjectNamePropety . PropertyType ;
var navEntityInfo = this . Context . EntityMaintenance . GetEntityInfo ( navType ) ;
var navPkColumn = navEntityInfo . Columns . Where ( it = > it . IsPrimarykey ) . FirstOrDefault ( ) ;
2022-04-13 22:26:44 +08:00
Check . ExceptionEasy ( navPkColumn = = null , navEntityInfo . EntityName + "need primarykey" , navEntityInfo . EntityName + " 需要主键" ) ;
2022-04-11 20:54:20 +08:00
var ids = list . Select ( it = > it . GetType ( ) . GetProperty ( navObjectNameColumnInfo . Navigat . Name ) . GetValue ( it ) ) . Select ( it = > it = = null ? "null" : it ) . Distinct ( ) . ToList ( ) ;
List < IConditionalModel > conditionalModels = new List < IConditionalModel > ( ) ;
conditionalModels . Add ( ( new ConditionalModel ( )
{
ConditionalType = ConditionalType . In ,
FieldName = navPkColumn . DbColumnName ,
FieldValue = String . Join ( "," , ids ) ,
CSharpTypeName = navObjectNameColumnInfo . PropertyInfo . PropertyType . Name
} ) ) ;
2022-04-19 13:24:48 +08:00
if ( list . Any ( ) & & navObjectNamePropety . GetValue ( list . First ( ) ) = = null )
2022-04-11 20:54:20 +08:00
{
2022-04-19 13:24:48 +08:00
var navList = selector ( this . Context . Queryable < object > ( ) . AS ( navEntityInfo . DbTableName ) . Where ( conditionalModels ) ) ;
foreach ( var item in list )
2022-04-18 12:04:35 +08:00
{
2022-04-19 13:24:48 +08:00
2022-04-18 12:04:35 +08:00
var setValue = navList . FirstOrDefault ( x = > navPkColumn . PropertyInfo . GetValue ( x ) . ObjToString ( ) = = navColumn . PropertyInfo . GetValue ( item ) . ObjToString ( ) ) ;
navObjectNamePropety . SetValue ( item , setValue ) ;
2022-04-19 13:24:48 +08:00
2022-04-18 12:04:35 +08:00
}
2022-04-11 20:54:20 +08:00
}
}
private void OneToMany ( List < object > list , Func < ISugarQueryable < object > , List < object > > selector , EntityInfo listItemEntity , System . Reflection . PropertyInfo navObjectNamePropety , EntityColumnInfo navObjectNameColumnInfo )
{
var navEntity = navObjectNameColumnInfo . PropertyInfo . PropertyType . GetGenericArguments ( ) [ 0 ] ;
var navEntityInfo = this . Context . EntityMaintenance . GetEntityInfo ( navEntity ) ;
var navColumn = navEntityInfo . Columns . FirstOrDefault ( it = > it . PropertyName = = navObjectNameColumnInfo . Navigat . Name ) ;
2022-04-16 00:31:52 +08:00
Check . ExceptionEasy ( navColumn = = null , $"{navEntityInfo.EntityName} not found {navObjectNameColumnInfo.Navigat.Name} " , $"实体 {navEntityInfo.EntityName} 未找到导航配置列 {navObjectNameColumnInfo.Navigat.Name} " ) ;
2022-04-11 20:54:20 +08:00
//var navType = navObjectNamePropety.PropertyType;
var listItemPkColumn = listItemEntity . Columns . Where ( it = > it . IsPrimarykey ) . FirstOrDefault ( ) ;
2022-04-13 22:26:44 +08:00
Check . ExceptionEasy ( listItemPkColumn = = null , listItemEntity . EntityName + " not primary key" , listItemEntity . EntityName + "没有主键" ) ;
2022-04-11 20:54:20 +08:00
var ids = list . Select ( it = > it . GetType ( ) . GetProperty ( listItemPkColumn . PropertyName ) . GetValue ( it ) ) . Select ( it = > it = = null ? "null" : it ) . Distinct ( ) . ToList ( ) ;
List < IConditionalModel > conditionalModels = new List < IConditionalModel > ( ) ;
conditionalModels . Add ( ( new ConditionalModel ( )
{
ConditionalType = ConditionalType . In ,
2022-04-13 22:01:14 +08:00
FieldName = navColumn . DbColumnName ,
2022-04-11 20:54:20 +08:00
FieldValue = String . Join ( "," , ids ) ,
CSharpTypeName = listItemPkColumn . PropertyInfo . PropertyType . Name
} ) ) ;
2022-04-13 20:50:17 +08:00
var sqlObj = GetWhereSql ( ) ;
2022-04-19 13:24:48 +08:00
if ( list . Any ( ) & & navObjectNamePropety . GetValue ( list . First ( ) ) = = null )
2022-04-11 21:19:51 +08:00
{
2022-04-19 13:24:48 +08:00
var navList = selector ( this . Context . Queryable < object > ( ) . AS ( navEntityInfo . DbTableName ) . AddParameters ( sqlObj . Parameters ) . Where ( conditionalModels ) . WhereIF ( sqlObj . WhereString . HasValue ( ) , sqlObj . WhereString ) . Select ( sqlObj . SelectString ) . OrderByIF ( sqlObj . OrderByString . HasValue ( ) , sqlObj . OrderByString ) ) ;
if ( navList . HasValue ( ) )
2022-04-11 20:54:20 +08:00
{
2022-04-19 13:24:48 +08:00
foreach ( var item in list )
2022-04-11 20:54:20 +08:00
{
2022-04-18 12:04:35 +08:00
var setValue = navList
. Where ( x = > navColumn . PropertyInfo . GetValue ( x ) . ObjToString ( ) = = listItemPkColumn . PropertyInfo . GetValue ( item ) . ObjToString ( ) ) . ToList ( ) ;
var instance = Activator . CreateInstance ( navObjectNamePropety . PropertyType , true ) ;
var ilist = instance as IList ;
foreach ( var value in setValue )
{
ilist . Add ( value ) ;
}
navObjectNamePropety . SetValue ( item , instance ) ;
2022-04-11 20:54:20 +08:00
}
}
2022-04-11 21:19:51 +08:00
}
2022-04-11 20:54:20 +08:00
}
2022-04-13 20:50:17 +08:00
private SqlInfo GetWhereSql ( )
{
if ( _ListCallFunc = = null | | _ListCallFunc . Count = = 0 ) return new SqlInfo ( ) ;
List < string > where = new List < string > ( ) ;
List < string > oredrBy = new List < string > ( ) ;
_ListCallFunc . Reverse ( ) ;
SqlInfo result = new SqlInfo ( ) ;
2022-04-13 21:10:02 +08:00
result . Parameters = new List < SugarParameter > ( ) ;
2022-04-13 21:37:16 +08:00
var isList = false ;
2022-04-13 20:50:17 +08:00
foreach ( var item in _ListCallFunc )
{
var method = item as MethodCallExpression ;
2022-04-13 21:10:02 +08:00
var queryable = this . Context . Queryable < object > ( ) ;
2022-04-13 20:50:17 +08:00
if ( method . Method . Name = = "Where" )
{
var exp = method . Arguments [ 1 ] ;
2022-04-13 21:10:02 +08:00
where . Add ( " " + queryable . QueryBuilder . GetExpressionValue ( exp , ResolveExpressType . WhereSingle ) . GetString ( ) ) ;
2022-04-13 20:50:17 +08:00
}
2022-04-15 10:44:41 +08:00
else if ( method . Method . Name = = "WhereIF" )
2022-04-14 19:22:48 +08:00
{
var isOk = LambdaExpression . Lambda ( method . Arguments [ 1 ] ) . Compile ( ) . DynamicInvoke ( ) ;
if ( isOk . ObjToBool ( ) )
{
var exp = method . Arguments [ 2 ] ;
where . Add ( " " + queryable . QueryBuilder . GetExpressionValue ( exp , ResolveExpressType . WhereSingle ) . GetString ( ) ) ;
}
}
2022-04-13 20:50:17 +08:00
else if ( method . Method . Name = = "OrderBy" )
{
var exp = method . Arguments [ 1 ] ;
2022-04-14 19:22:48 +08:00
oredrBy . Add ( " " + queryable . QueryBuilder . GetExpressionValue ( exp , ResolveExpressType . WhereSingle ) . GetString ( ) ) ;
2022-04-13 20:50:17 +08:00
}
2022-04-18 15:17:11 +08:00
else if ( method . Method . Name = = "Select" )
{
var exp = method . Arguments [ 1 ] ;
2022-04-19 13:47:33 +08:00
var newExp = ( exp as LambdaExpression ) . Body ;
2022-04-18 15:17:11 +08:00
var types = exp . Type . GetGenericArguments ( ) ;
if ( types ! = null & & types . Length > 0 )
{
var type = types [ 0 ] ;
var entityInfo = this . Context . EntityMaintenance . GetEntityInfo ( type ) ;
2022-04-19 13:47:33 +08:00
Check . ExceptionEasy ( newExp . Type ! = entityInfo . Type , $" new {newExp.Type .Name}is error ,use Select(it=>new {entityInfo.Type.Name})" , $"new {newExp.Type.Name}是错误的, 请使用Select(it=>new {entityInfo.Type.Name})" ) ;
2022-04-18 15:17:11 +08:00
if ( entityInfo . Columns . Count ( x = > x . Navigat ! = null ) = = 0 )
{
result . SelectString = ( " " + queryable . QueryBuilder . GetExpressionValue ( exp , ResolveExpressType . SelectSingle ) . GetString ( ) ) ;
}
else
{
var pkInfo = entityInfo . Columns . FirstOrDefault ( x = > x . IsPrimarykey ) ;
if ( pkInfo ! = null )
{
var pkName = pkInfo . DbColumnName ;
AppColumns ( result , queryable , pkName ) ;
}
foreach ( var nav in entityInfo . Columns . Where ( x = > x . Navigat ! = null & & x . Navigat . NavigatType = = NavigateType . OneToOne ) )
{
var navColumn = entityInfo . Columns . FirstOrDefault ( it = > it . PropertyName = = nav . Navigat . Name ) ;
if ( navColumn ! = null )
{
AppColumns ( result , queryable , navColumn . DbColumnName ) ;
}
}
}
}
}
2022-04-13 20:50:17 +08:00
else if ( method . Method . Name = = "OrderByDescending" )
{
var exp = method . Arguments [ 1 ] ;
2022-04-14 19:22:48 +08:00
oredrBy . Add ( " " + queryable . QueryBuilder . GetExpressionValue ( exp , ResolveExpressType . WhereSingle ) . GetString ( ) + " DESC" ) ;
2022-04-13 20:50:17 +08:00
}
else if ( method . Method . Name = = "ToList" )
2022-04-13 21:37:16 +08:00
{
isList = true ;
2022-04-13 20:50:17 +08:00
}
2022-04-14 19:22:48 +08:00
else
2022-04-13 20:50:17 +08:00
{
Check . ExceptionEasy ( $"no support {item}" , $"不支持表达式{item} 不支持方法{method.Method.Name}" ) ;
}
2022-04-13 21:10:02 +08:00
if ( queryable . QueryBuilder . Parameters ! = null )
result . Parameters . AddRange ( queryable . QueryBuilder . Parameters ) ;
2022-04-13 20:50:17 +08:00
}
if ( where . Any ( ) )
{
2022-04-13 21:37:16 +08:00
Check . Exception ( isList = = false , $"{_ListCallFunc.First()} need is ToList()" , $"{_ListCallFunc.First()} 需要ToList" ) ;
2022-04-13 20:50:17 +08:00
result . WhereString = String . Join ( " AND " , where ) ;
}
if ( oredrBy . Any ( ) )
{
2022-04-13 21:37:16 +08:00
Check . Exception ( isList = = false , $"{_ListCallFunc.First()} need is ToList()" , $"{_ListCallFunc.First()} 需要ToList" ) ;
2022-04-13 20:50:17 +08:00
result . OrderByString = String . Join ( " , " , oredrBy ) ;
}
2022-04-19 13:47:33 +08:00
if ( result . SelectString . HasValue ( ) )
{
Check . Exception ( isList = = false , $"{_ListCallFunc.First()} need is ToList()" , $"{_ListCallFunc.First()} 需要ToList" ) ;
result . OrderByString = String . Join ( " , " , oredrBy ) ;
}
2022-04-13 20:50:17 +08:00
return result ;
}
2022-04-18 15:17:11 +08:00
private static void AppColumns ( SqlInfo result , ISugarQueryable < object > queryable , string columnName )
{
var selectPkName = queryable . SqlBuilder . GetTranslationColumnName ( columnName ) ;
if ( result . SelectString . HasValue ( ) & & ! result . SelectString . ToLower ( ) . Contains ( selectPkName . ToLower ( ) ) )
{
result . SelectString = result . SelectString + "," + selectPkName ;
}
}
2022-04-13 20:50:17 +08:00
public class SqlInfo
{
public string WhereString { get ; set ; }
public string OrderByString { get ; set ; }
2022-04-18 15:17:11 +08:00
public string SelectString { get ; set ; }
2022-04-13 21:10:02 +08:00
public List < SugarParameter > Parameters { get ; set ; }
2022-04-13 20:50:17 +08:00
}
2022-04-11 14:04:22 +08:00
}
}