2022-10-22 18:23:02 +08:00
using System ;
using System.Collections ;
using System.Collections.Generic ;
using System.Data ;
using System.Linq ;
using System.Linq.Expressions ;
using System.Text ;
using System.Text.RegularExpressions ;
using System.Reflection ;
using System.Dynamic ;
using System.Threading.Tasks ;
2022-11-27 14:25:16 +08:00
using System.Collections.ObjectModel ;
2022-10-22 18:23:02 +08:00
2022-10-24 14:41:23 +08:00
namespace SqlSugar
2022-10-22 18:23:02 +08:00
{
public partial class QueryableProvider < T > : QueryableAccessory , ISugarQueryable < T >
{
2022-10-23 14:48:47 +08:00
#region Tree
2022-10-22 19:12:57 +08:00
private List < T > _ToParentListByTreeKey ( Expression < Func < T , object > > parentIdExpression , object primaryKeyValue )
{
var entity = this . Context . EntityMaintenance . GetEntityInfo < T > ( ) ;
var treeKey = entity . Columns . FirstOrDefault ( it = > it . IsTreeKey ) ;
List < T > result = new List < T > ( ) { } ;
var parentIdName = UtilConvert . ToMemberExpression ( ( parentIdExpression as LambdaExpression ) . Body ) . Member . Name ;
var ParentInfo = entity . Columns . First ( it = > it . PropertyName = = parentIdName ) ;
var parentPropertyName = ParentInfo . DbColumnName ;
var tableName = this . QueryBuilder . GetTableNameString ;
if ( this . QueryBuilder . IsSingle ( ) = = false )
{
if ( this . QueryBuilder . JoinQueryInfos . Count > 0 )
{
tableName = this . QueryBuilder . JoinQueryInfos . First ( ) . TableName ;
}
if ( this . QueryBuilder . EasyJoinInfos . Count > 0 )
{
tableName = this . QueryBuilder . JoinQueryInfos . First ( ) . TableName ;
}
}
var current = this . Context . Queryable < T > ( ) . AS ( tableName ) . Filter ( null , this . QueryBuilder . IsDisabledGobalFilter ) . Where ( new List < IConditionalModel > ( ) {
new ConditionalModel ( )
{
ConditionalType = ConditionalType . Equal ,
CSharpTypeName = treeKey . PropertyInfo . PropertyType . Name ,
FieldValue = primaryKeyValue + "" ,
FieldName = treeKey . DbColumnName
} } ) . First ( ) ;
if ( current ! = null )
{
result . Add ( current ) ;
object parentId = ParentInfo . PropertyInfo . GetValue ( current , null ) ;
int i = 0 ;
while ( parentId ! = null & & this . Context . Queryable < T > ( ) . AS ( tableName ) . Filter ( null , this . QueryBuilder . IsDisabledGobalFilter ) . Where ( new List < IConditionalModel > ( ) {
new ConditionalModel ( )
{
ConditionalType = ConditionalType . Equal ,
CSharpTypeName = treeKey . PropertyInfo . PropertyType . Name ,
FieldValue = parentId + "" ,
FieldName = treeKey . DbColumnName
} } ) . Any ( ) )
{
Check . Exception ( i > 100 , ErrorMessage . GetThrowMessage ( "Dead cycle" , "出现死循环或超出循环上限( 100) , 检查最顶层的ParentId是否是null或者0" ) ) ;
var parent = this . Context . Queryable < T > ( ) . AS ( tableName ) . Filter ( null , this . QueryBuilder . IsDisabledGobalFilter ) . Where ( new List < IConditionalModel > ( ) {
new ConditionalModel ( )
{
ConditionalType = ConditionalType . Equal ,
CSharpTypeName = treeKey . PropertyInfo . PropertyType . Name ,
FieldValue = parentId + "" ,
FieldName = treeKey . DbColumnName
} } ) . First ( ) ;
result . Add ( parent ) ;
parentId = ParentInfo . PropertyInfo . GetValue ( parent , null ) ;
+ + i ;
}
}
return result ;
}
private async Task < List < T > > _ToParentListByTreeKeyAsync ( Expression < Func < T , object > > parentIdExpression , object primaryKeyValue )
{
var entity = this . Context . EntityMaintenance . GetEntityInfo < T > ( ) ;
var treeKey = entity . Columns . FirstOrDefault ( it = > it . IsTreeKey ) ;
List < T > result = new List < T > ( ) { } ;
var parentIdName = UtilConvert . ToMemberExpression ( ( parentIdExpression as LambdaExpression ) . Body ) . Member . Name ;
var ParentInfo = entity . Columns . First ( it = > it . PropertyName = = parentIdName ) ;
var parentPropertyName = ParentInfo . DbColumnName ;
var tableName = this . QueryBuilder . GetTableNameString ;
if ( this . QueryBuilder . IsSingle ( ) = = false )
{
if ( this . QueryBuilder . JoinQueryInfos . Count > 0 )
{
tableName = this . QueryBuilder . JoinQueryInfos . First ( ) . TableName ;
}
if ( this . QueryBuilder . EasyJoinInfos . Count > 0 )
{
tableName = this . QueryBuilder . JoinQueryInfos . First ( ) . TableName ;
}
}
var current = await this . Context . Queryable < T > ( ) . AS ( tableName ) . Filter ( null , this . QueryBuilder . IsDisabledGobalFilter ) . Where ( new List < IConditionalModel > ( ) {
new ConditionalModel ( )
{
ConditionalType = ConditionalType . Equal ,
CSharpTypeName = treeKey . PropertyInfo . PropertyType . Name ,
FieldValue = primaryKeyValue + "" ,
FieldName = treeKey . DbColumnName
} } ) . FirstAsync ( ) ;
if ( current ! = null )
{
result . Add ( current ) ;
object parentId = ParentInfo . PropertyInfo . GetValue ( current , null ) ;
int i = 0 ;
while ( parentId ! = null & & await this . Context . Queryable < T > ( ) . AS ( tableName ) . Filter ( null , this . QueryBuilder . IsDisabledGobalFilter ) . Where ( new List < IConditionalModel > ( ) {
new ConditionalModel ( )
{
ConditionalType = ConditionalType . Equal ,
CSharpTypeName = treeKey . PropertyInfo . PropertyType . Name ,
FieldValue = parentId + "" ,
FieldName = treeKey . DbColumnName
} } ) . AnyAsync ( ) )
{
Check . Exception ( i > 100 , ErrorMessage . GetThrowMessage ( "Dead cycle" , "出现死循环或超出循环上限( 100) , 检查最顶层的ParentId是否是null或者0" ) ) ;
var parent = await this . Context . Queryable < T > ( ) . AS ( tableName ) . Filter ( null , this . QueryBuilder . IsDisabledGobalFilter ) . Where ( new List < IConditionalModel > ( ) {
new ConditionalModel ( )
{
ConditionalType = ConditionalType . Equal ,
CSharpTypeName = treeKey . PropertyInfo . PropertyType . Name ,
FieldValue = parentId + "" ,
FieldName = treeKey . DbColumnName
} } ) . FirstAsync ( ) ;
result . Add ( parent ) ;
parentId = ParentInfo . PropertyInfo . GetValue ( parent , null ) ;
+ + i ;
}
}
return result ;
}
2022-10-22 18:23:02 +08:00
private List < T > GetChildList ( Expression < Func < T , object > > parentIdExpression , string pkName , List < T > list , object rootValue , bool isContainOneself )
{
var exp = ( parentIdExpression as LambdaExpression ) . Body ;
if ( exp is UnaryExpression )
{
exp = ( exp as UnaryExpression ) . Operand ;
}
var parentIdName = ( exp as MemberExpression ) . Member . Name ;
var result = BuildChildList ( list , pkName , parentIdName , rootValue , isContainOneself ) ;
return result ;
}
private static List < T > BuildChildList ( List < T > list , string idName , string pIdName , object rootValue , bool isContainOneself )
{
var type = typeof ( T ) ;
var idProp = type . GetProperty ( idName ) ;
var pIdProp = type . GetProperty ( pIdName ) ;
var kvpList = list . ToDictionary ( x = > x , v = > idProp . GetValue ( v ) . ObjToString ( ) ) ;
var groupKv = list . GroupBy ( x = > pIdProp . GetValue ( x ) . ObjToString ( ) ) . ToDictionary ( k = > k . Key , v = > v . ToList ( ) ) ;
Func < string , List < T > > fc = null ;
fc = ( rootVal ) = >
{
var finalList = new List < T > ( ) ;
if ( groupKv . TryGetValue ( rootVal , out var nextChildList ) )
{
finalList . AddRange ( nextChildList ) ;
foreach ( var child in nextChildList )
{
finalList . AddRange ( fc ( kvpList [ child ] ) ) ;
}
}
return finalList ;
} ;
var result = fc ( rootValue . ObjToString ( ) ) ;
if ( isContainOneself )
{
var root = kvpList . FirstOrDefault ( x = > x . Value = = rootValue . ObjToString ( ) ) . Key ;
if ( root ! = null )
{
result . Insert ( 0 , root ) ;
}
}
return result ;
}
2022-10-24 14:41:23 +08:00
private List < object > GetPrentIds ( List < T > list , object id , EntityColumnInfo pkName , EntityColumnInfo parentName )
{
var currentId = id ;
List < object > result = new List < object > ( ) ;
result . Add ( id ) ;
2022-10-24 15:16:37 +08:00
while ( list . Any ( it = > pkName . PropertyInfo . GetValue ( it ) . ObjToString ( ) = = currentId . ObjToString ( ) ) )
2022-10-24 14:41:23 +08:00
{
2022-10-24 15:16:37 +08:00
var data = list . First ( it = > pkName . PropertyInfo . GetValue ( it ) . ObjToString ( ) = = currentId . ObjToString ( ) ) ;
2022-10-24 14:41:23 +08:00
currentId = parentName . PropertyInfo . GetValue ( data ) ;
result . Add ( currentId ) ;
}
return result ;
}
private List < T > TreeAndFilterIds ( Expression < Func < T , IEnumerable < object > > > childListExpression , Expression < Func < T , object > > parentIdExpression , object rootValue , object [ ] childIds , ref List < T > list )
{
var entity = this . Context . EntityMaintenance . GetEntityInfo < T > ( ) ;
var pk = GetTreeKey ( entity ) ;
var pkColumn = entity . Columns . FirstOrDefault ( z = > z . PropertyName = = pk ) ;
var newIds = new List < object > ( ) ;
string parentIdName = GetParentName ( parentIdExpression ) ;
var parentColumn = entity . Columns . FirstOrDefault ( z = > z . PropertyName = = parentIdName ) ;
foreach ( var id in childIds )
{
newIds . AddRange ( GetPrentIds ( list , id , pkColumn , parentColumn ) ) ;
}
2022-10-24 15:16:37 +08:00
list = list . Where ( z = > newIds . Any ( it = > it . ObjToString ( ) = = pkColumn . PropertyInfo . GetValue ( z ) . ObjToString ( ) ) ) . ToList ( ) ;
2022-10-24 14:41:23 +08:00
return GetTreeRoot ( childListExpression , parentIdExpression , pk , list , rootValue ) ;
}
2022-10-22 18:23:02 +08:00
2022-11-12 20:00:13 +08:00
internal List < T > GetTreeRoot ( Expression < Func < T , IEnumerable < object > > > childListExpression , Expression < Func < T , object > > parentIdExpression , string pk , List < T > list , object rootValue )
2022-10-22 18:23:02 +08:00
{
var childName = ( ( childListExpression as LambdaExpression ) . Body as MemberExpression ) . Member . Name ;
2022-10-24 14:41:23 +08:00
string parentIdName = GetParentName ( parentIdExpression ) ;
return BuildTree ( list , pk , parentIdName , childName , rootValue ) ? . ToList ( ) ? ? default ;
}
private static string GetParentName ( Expression < Func < T , object > > parentIdExpression )
{
2022-10-22 18:23:02 +08:00
var exp = ( parentIdExpression as LambdaExpression ) . Body ;
if ( exp is UnaryExpression )
{
exp = ( exp as UnaryExpression ) . Operand ;
}
var parentIdName = ( exp as MemberExpression ) . Member . Name ;
2022-10-24 14:41:23 +08:00
return parentIdName ;
2022-10-22 18:23:02 +08:00
}
private static IEnumerable < T > BuildTree ( IEnumerable < T > list , string idName , string pIdName , string childName , object rootValue )
{
var type = typeof ( T ) ;
var mainIdProp = type . GetProperty ( idName ) ;
var pIdProp = type . GetProperty ( pIdName ) ;
var childProp = type . GetProperty ( childName ) ;
var kvList = list . ToDictionary ( x = > mainIdProp . GetValue ( x ) . ObjToString ( ) ) ;
var group = list . GroupBy ( x = > pIdProp . GetValue ( x ) . ObjToString ( ) ) ;
var root = rootValue ! = null ? group . FirstOrDefault ( x = > x . Key = = rootValue . ObjToString ( ) ) : group . FirstOrDefault ( x = > x . Key = = null | | x . Key = = "" | | x . Key = = "0" | | x . Key = = Guid . Empty . ToString ( ) ) ;
if ( root ! = null )
{
foreach ( var item in group )
{
if ( kvList . TryGetValue ( item . Key , out var parent ) )
{
childProp . SetValue ( parent , item . ToList ( ) ) ;
}
}
}
return root ;
}
public List < T > GetTreeChildList ( List < T > alllist , object pkValue , string pkName , string childName , string parentIdName )
{
var result = alllist . Where ( it = >
{
var value = it . GetType ( ) . GetProperty ( parentIdName ) . GetValue ( it ) ;
return value . ObjToString ( ) = = pkValue . ObjToString ( ) ;
} ) . ToList ( ) ;
if ( result ! = null & & result . Count > 0 )
{
foreach ( var item in result )
{
var itemPkValue = item . GetType ( ) . GetProperty ( pkName ) . GetValue ( item ) ;
item . GetType ( ) . GetProperty ( childName ) . SetValue ( item , GetTreeChildList ( alllist , itemPkValue , pkName , childName , parentIdName ) ) ;
}
}
return result ;
}
2022-10-23 14:48:47 +08:00
private static string GetTreeKey ( EntityInfo entity )
2022-10-22 18:23:02 +08:00
{
2022-10-23 14:48:47 +08:00
Check . Exception ( entity . Columns . Where ( it = > it . IsPrimarykey | | it . IsTreeKey ) . Count ( ) = = 0 , "need IsPrimary=true Or IsTreeKey=true" ) ;
string pk = entity . Columns . Where ( it = > it . IsTreeKey ) . FirstOrDefault ( ) ? . PropertyName ;
if ( pk = = null )
pk = entity . Columns . Where ( it = > it . IsPrimarykey ) . FirstOrDefault ( ) ? . PropertyName ;
return pk ;
2022-10-22 18:23:02 +08:00
}
2022-10-23 14:48:47 +08:00
#endregion
2022-10-22 18:23:02 +08:00
2022-10-23 14:48:47 +08:00
#region Count
protected int GetCount ( )
{
var sql = string . Empty ;
ToSqlBefore ( ) ;
sql = QueryBuilder . ToSqlString ( ) ;
sql = QueryBuilder . ToCountSql ( sql ) ;
var result = Context . Ado . GetInt ( sql , QueryBuilder . Parameters . ToArray ( ) ) ;
return result ;
}
protected async Task < int > GetCountAsync ( )
{
var sql = string . Empty ;
ToSqlBefore ( ) ;
sql = QueryBuilder . ToSqlString ( ) ;
sql = QueryBuilder . ToCountSql ( sql ) ;
var result = Convert . ToInt32 ( await Context . Ado . GetScalarAsync ( sql , QueryBuilder . Parameters . ToArray ( ) ) ) ;
return result ;
}
2022-10-22 18:23:02 +08:00
private void _CountEnd ( MappingTableList expMapping )
{
RestoreMapping ( ) ;
QueryBuilder . IsCount = false ;
if ( expMapping . Count > 0 )
{
if ( this . QueryableMappingTableList = = null )
{
this . QueryableMappingTableList = new MappingTableList ( ) ;
}
this . QueryableMappingTableList . Add ( expMapping . First ( ) ) ;
}
}
private void _CountBegin ( out MappingTableList expMapping , out int result )
{
expMapping = new MappingTableList ( ) ;
if ( QueryBuilder . EntityName = = "ExpandoObject" & & this . Context . MappingTables . Any ( it = > it . EntityName = = "ExpandoObject" ) )
{
expMapping . Add ( "ExpandoObject" , this . Context . MappingTables . First ( it = > it . EntityName = = "ExpandoObject" ) . DbTableName ) ;
}
InitMapping ( ) ;
QueryBuilder . IsCount = true ;
result = 0 ;
}
2022-10-23 14:48:47 +08:00
#endregion
2022-10-22 18:23:02 +08:00
2022-10-23 14:48:47 +08:00
#region Min Max Sum Gvg
2022-10-22 18:23:02 +08:00
protected TResult _Min < TResult > ( Expression expression )
{
QueryBuilder . CheckExpression ( expression , "Main" ) ;
var isSingle = QueryBuilder . IsSingle ( ) ;
var lamResult = QueryBuilder . GetExpressionValue ( expression , isSingle ? ResolveExpressType . FieldSingle : ResolveExpressType . FieldMultiple ) ;
var result = Min < TResult > ( lamResult . GetResultString ( ) ) ;
QueryBuilder . SelectValue = null ;
return result ;
}
protected async Task < TResult > _MinAsync < TResult > ( Expression expression )
{
QueryBuilder . CheckExpression ( expression , "Main" ) ;
var isSingle = QueryBuilder . IsSingle ( ) ;
var lamResult = QueryBuilder . GetExpressionValue ( expression , isSingle ? ResolveExpressType . FieldSingle : ResolveExpressType . FieldMultiple ) ;
var result = await MinAsync < TResult > ( lamResult . GetResultString ( ) ) ;
QueryBuilder . SelectValue = null ;
return result ;
}
protected TResult _Avg < TResult > ( Expression expression )
{
QueryBuilder . CheckExpression ( expression , "Avg" ) ;
var isSingle = QueryBuilder . IsSingle ( ) ;
var lamResult = QueryBuilder . GetExpressionValue ( expression , isSingle ? ResolveExpressType . FieldSingle : ResolveExpressType . FieldMultiple ) ;
return Avg < TResult > ( lamResult . GetResultString ( ) ) ;
}
protected async Task < TResult > _AvgAsync < TResult > ( Expression expression )
{
QueryBuilder . CheckExpression ( expression , "Avg" ) ;
var isSingle = QueryBuilder . IsSingle ( ) ;
var lamResult = QueryBuilder . GetExpressionValue ( expression , isSingle ? ResolveExpressType . FieldSingle : ResolveExpressType . FieldMultiple ) ;
return await AvgAsync < TResult > ( lamResult . GetResultString ( ) ) ;
}
protected TResult _Max < TResult > ( Expression expression )
{
QueryBuilder . CheckExpression ( expression , "Max" ) ;
var isSingle = QueryBuilder . IsSingle ( ) ;
var lamResult = QueryBuilder . GetExpressionValue ( expression , isSingle ? ResolveExpressType . FieldSingle : ResolveExpressType . FieldMultiple ) ;
var reslut = Max < TResult > ( lamResult . GetResultString ( ) ) ;
QueryBuilder . SelectValue = null ;
return reslut ;
}
protected async Task < TResult > _MaxAsync < TResult > ( Expression expression )
{
QueryBuilder . CheckExpression ( expression , "Max" ) ;
var isSingle = QueryBuilder . IsSingle ( ) ;
var lamResult = QueryBuilder . GetExpressionValue ( expression , isSingle ? ResolveExpressType . FieldSingle : ResolveExpressType . FieldMultiple ) ;
var reslut = await MaxAsync < TResult > ( lamResult . GetResultString ( ) ) ;
QueryBuilder . SelectValue = null ;
return reslut ;
}
protected TResult _Sum < TResult > ( Expression expression )
{
QueryBuilder . CheckExpression ( expression , "Sum" ) ;
var isSingle = QueryBuilder . IsSingle ( ) ;
var lamResult = QueryBuilder . GetExpressionValue ( expression , isSingle ? ResolveExpressType . FieldSingle : ResolveExpressType . FieldMultiple ) ;
var reslut = Sum < TResult > ( lamResult . GetResultString ( ) ) ;
QueryBuilder . SelectValue = null ;
return reslut ;
}
protected async Task < TResult > _SumAsync < TResult > ( Expression expression )
{
QueryBuilder . CheckExpression ( expression , "Sum" ) ;
var isSingle = QueryBuilder . IsSingle ( ) ;
var lamResult = QueryBuilder . GetExpressionValue ( expression , isSingle ? ResolveExpressType . FieldSingle : ResolveExpressType . FieldMultiple ) ;
var reslut = await SumAsync < TResult > ( lamResult . GetResultString ( ) ) ;
QueryBuilder . SelectValue = null ;
return reslut ;
}
2022-10-23 14:48:47 +08:00
#endregion
#region Master Slave
private void RestChangeMasterQuery ( bool isChangeQueryableMasterSlave )
2022-10-22 18:23:02 +08:00
{
2022-10-23 14:48:47 +08:00
if ( isChangeQueryableMasterSlave )
this . Context . Ado . IsDisableMasterSlaveSeparation = false ;
2022-10-22 18:23:02 +08:00
}
2022-10-23 14:48:47 +08:00
private bool GetIsMasterQuery ( )
2022-10-22 18:23:02 +08:00
{
2022-10-23 14:48:47 +08:00
var isChangeQueryableMasterSlave =
this . QueryBuilder . IsDisableMasterSlaveSeparation = = true & &
this . Context . Ado . IsDisableMasterSlaveSeparation = = false & &
this . Context . Ado . Transaction = = null ;
if ( isChangeQueryableMasterSlave )
this . Context . Ado . IsDisableMasterSlaveSeparation = true ;
return isChangeQueryableMasterSlave ;
2022-10-22 18:23:02 +08:00
}
2022-10-23 14:48:47 +08:00
private void RestChangeSlaveQuery ( bool isChangeQueryableSlaveSlave )
2022-10-22 18:23:02 +08:00
{
2022-10-23 14:48:47 +08:00
if ( isChangeQueryableSlaveSlave )
this . Context . Ado . IsDisableMasterSlaveSeparation = true ;
2022-10-22 18:23:02 +08:00
}
2022-10-23 14:48:47 +08:00
private bool GetIsSlaveQuery ( )
2022-10-22 18:23:02 +08:00
{
2022-10-23 14:48:47 +08:00
var isChangeQueryableMasterSlave =
this . QueryBuilder . IsEnableMasterSlaveSeparation = = true & &
this . Context . Ado . IsDisableMasterSlaveSeparation = = true & &
this . Context . Ado . Transaction = = null ;
if ( isChangeQueryableMasterSlave )
this . Context . Ado . IsDisableMasterSlaveSeparation = false ;
return isChangeQueryableMasterSlave ;
2022-10-22 18:23:02 +08:00
}
2022-10-23 14:48:47 +08:00
#endregion
#region Navigate
2022-10-22 18:23:02 +08:00
private async Task _InitNavigatAsync < TResult > ( List < TResult > result )
{
if ( this . QueryBuilder . Includes ! = null )
{
await Task . Run ( ( ) = > { _InitNavigat ( result ) ; } ) ;
}
}
private void _InitNavigat < TResult > ( List < TResult > result )
{
if ( this . QueryBuilder . Includes ! = null )
{
var managers = ( this . QueryBuilder . Includes as List < object > ) ;
if ( this . QueryBuilder . SelectValue . HasValue ( ) & & this . QueryBuilder . NoCheckInclude = = false )
{
Check . ExceptionEasy ( "To use includes, use select after tolist()" , "使用Includes请在ToList()之后在使用Select" ) ;
}
foreach ( var it in managers )
{
var manager = it as NavigatManager < TResult > ;
manager . RootList = result ;
manager . Execute ( ) ;
}
}
}
protected void _Mapper < TResult > ( List < TResult > result )
{
if ( this . EntityInfo . Columns . Any ( it = > it . IsTranscoding ) )
{
foreach ( var item in result )
{
foreach ( var column in this . EntityInfo . Columns . Where ( it = > it . IsTranscoding ) )
{
var value = column . PropertyInfo . GetValue ( item , null ) ;
if ( value ! = null )
{
column . PropertyInfo . SetValue ( item , UtilMethods . DecodeBase64 ( value . ToString ( ) ) , null ) ;
}
}
}
}
if ( this . Mappers . HasValue ( ) )
{
foreach ( var mapper in this . Mappers )
{
if ( typeof ( TResult ) = = typeof ( T ) )
{
mapper ( result . Select ( it = > ( T ) Convert . ChangeType ( it , typeof ( T ) ) ) . ToList ( ) ) ;
}
else
{
Check . Exception ( true , "{0} and {1} are not a type, Try .select().mapper().ToList" , typeof ( TResult ) . FullName , typeof ( T ) . FullName ) ;
}
}
}
if ( this . MapperAction ! = null )
{
foreach ( TResult item in result )
{
if ( typeof ( TResult ) = = typeof ( T ) )
{
foreach ( var mapper in this . MapperAction )
{
mapper ( ( T ) ( item as object ) ) ;
}
}
else
{
Check . Exception ( true , "{0} and {1} are not a type, Try .select().mapper().ToList" , typeof ( TResult ) . FullName , typeof ( T ) . FullName ) ;
}
}
}
if ( this . MapperActionWithCache ! = null )
{
if ( typeof ( TResult ) = = typeof ( T ) )
{
var list = ( List < T > ) Convert . ChangeType ( result , typeof ( List < T > ) ) ;
var mapperCache = new MapperCache < T > ( list , this . Context ) ;
foreach ( T item in list )
{
mapperCache . GetIndex = 0 ;
this . MapperActionWithCache ( item , mapperCache ) ;
}
}
else
{
Check . Exception ( true , "{0} and {1} are not a type, Try .select().mapper().ToList" , typeof ( TResult ) . FullName , typeof ( T ) . FullName ) ;
}
}
}
private ISugarQueryable < T > _Mapper < TObject > ( Expression mapperObject , Expression mapperField )
{
if ( ( mapperObject as LambdaExpression ) . Body is UnaryExpression )
{
mapperObject = ( ( mapperObject as LambdaExpression ) . Body as UnaryExpression ) . Operand ;
}
else
{
mapperObject = ( mapperObject as LambdaExpression ) . Body ;
}
if ( ( mapperField as LambdaExpression ) . Body is UnaryExpression )
{
mapperField = ( ( mapperField as LambdaExpression ) . Body as UnaryExpression ) . Operand ;
}
else
{
mapperField = ( mapperField as LambdaExpression ) . Body ;
}
Check . Exception ( mapperObject is MemberExpression = = false | | mapperField is MemberExpression = = false , ".Mapper() parameter error" ) ;
var mapperObjectExp = mapperObject as MemberExpression ;
var mapperFieldExp = mapperField as MemberExpression ;
Check . Exception ( mapperFieldExp . Type . IsClass ( ) , ".Mapper() parameter error" ) ;
var objType = mapperObjectExp . Type ;
var filedType = mapperFieldExp . Expression . Type ;
Check . Exception ( objType ! = typeof ( TObject ) & & objType ! = typeof ( List < TObject > ) , ".Mapper() parameter error" ) ;
if ( objType = = typeof ( List < TObject > ) )
{
objType = typeof ( TObject ) ;
}
var filedName = mapperFieldExp . Member . Name ;
var objName = mapperObjectExp . Member . Name ;
var filedEntity = this . Context . EntityMaintenance . GetEntityInfo ( objType ) ;
var objEntity = this . Context . EntityMaintenance . GetEntityInfo ( filedType ) ;
var isSelf = filedType = = typeof ( T ) ;
if ( Mappers = = null )
Mappers = new List < Action < List < T > > > ( ) ;
if ( isSelf )
{
Action < List < T > > mapper = ( entitys ) = >
{
if ( entitys . IsNullOrEmpty ( ) | | ! entitys . Any ( ) ) return ;
var entity = entitys . First ( ) ;
var whereCol = filedEntity . Columns . FirstOrDefault ( it = > it . PropertyName . Equals ( filedName , StringComparison . CurrentCultureIgnoreCase ) ) ;
if ( whereCol = = null )
{
whereCol = filedEntity . Columns . FirstOrDefault ( it = > it . IsPrimarykey = = true ) ;
}
if ( whereCol = = null )
{
whereCol = filedEntity . Columns . FirstOrDefault ( it = > GetPrimaryKeys ( ) . Any ( pk = > pk . Equals ( it . DbColumnName , StringComparison . CurrentCultureIgnoreCase ) ) ) ;
}
if ( whereCol = = null )
{
whereCol = filedEntity . Columns . FirstOrDefault ( it = > it . PropertyName . Equals ( "id" , StringComparison . CurrentCultureIgnoreCase ) ) ;
}
if ( whereCol = = null )
{
whereCol = filedEntity . Columns . FirstOrDefault ( it = > ( it . PropertyName ) . Equals ( it . EntityName + "id" , StringComparison . CurrentCultureIgnoreCase ) ) ;
}
if ( whereCol = = null )
{
Check . Exception ( true , ".Mapper() parameter error" ) ;
}
List < string > inValues = entitys . Select ( it = > it . GetType ( ) . GetProperty ( filedName ) . GetValue ( it , null ) . ObjToString ( ) ) . ToList ( ) ;
if ( inValues ! = null & & inValues . Any ( ) & & UtilMethods . GetUnderType ( entitys . First ( ) . GetType ( ) . GetProperty ( filedName ) . PropertyType ) = = UtilConstants . GuidType )
{
inValues = inValues . Select ( x = > x = = "" ? "null" : x ) . Distinct ( ) . ToList ( ) ;
}
List < IConditionalModel > wheres = new List < IConditionalModel > ( )
{
new ConditionalModel ( )
{
FieldName = this . SqlBuilder . GetTranslationColumnName ( whereCol . DbColumnName ) ,
ConditionalType = ConditionalType . In ,
FieldValue = string . Join ( "," , inValues . Distinct ( ) ) ,
CSharpTypeName = whereCol . PropertyInfo . PropertyType . Name
}
} ;
var list = this . Context . Queryable < TObject > ( ) . Where ( wheres ) . ToList ( ) ;
foreach ( var item in entitys )
{
var whereValue = item . GetType ( ) . GetProperty ( filedName ) . GetValue ( item , null ) ;
var setValue = list . Where ( x = > x . GetType ( ) . GetProperty ( whereCol . PropertyName ) . GetValue ( x , null ) . ObjToString ( ) = = whereValue . ObjToString ( ) ) . ToList ( ) ;
var setObject = item . GetType ( ) . GetProperty ( objName ) ;
if ( setObject . PropertyType . FullName . IsCollectionsList ( ) )
{
setObject . SetValue ( item , setValue . ToList ( ) , null ) ;
}
else
{
setObject . SetValue ( item , setValue . FirstOrDefault ( ) , null ) ;
}
}
} ;
Mappers . Add ( mapper ) ;
}
else
{
Action < List < T > > mapper = ( entitys ) = >
{
if ( entitys . IsNullOrEmpty ( ) | | ! entitys . Any ( ) ) return ;
var entity = entitys . First ( ) ;
var tEntity = this . Context . EntityMaintenance . GetEntityInfo < T > ( ) ;
var whereCol = tEntity . Columns . FirstOrDefault ( it = > it . PropertyName . Equals ( filedName , StringComparison . CurrentCultureIgnoreCase ) ) ;
if ( whereCol = = null )
{
whereCol = tEntity . Columns . FirstOrDefault ( it = > it . IsPrimarykey = = true ) ;
}
if ( whereCol = = null )
{
whereCol = tEntity . Columns . FirstOrDefault ( it = > GetPrimaryKeys ( ) . Any ( pk = > pk . Equals ( it . DbColumnName , StringComparison . CurrentCultureIgnoreCase ) ) ) ;
}
if ( whereCol = = null )
{
whereCol = tEntity . Columns . FirstOrDefault ( it = > it . PropertyName . Equals ( "id" , StringComparison . CurrentCultureIgnoreCase ) ) ;
}
if ( whereCol = = null )
{
whereCol = tEntity . Columns . FirstOrDefault ( it = > ( it . PropertyName ) . Equals ( it . EntityName + "id" , StringComparison . CurrentCultureIgnoreCase ) ) ;
}
if ( whereCol = = null )
{
Check . Exception ( true , ".Mapper() parameter error" ) ;
}
List < string > inValues = entitys . Select ( it = > it . GetType ( ) . GetProperty ( whereCol . PropertyName ) . GetValue ( it , null ) . ObjToString ( ) ) . ToList ( ) ;
var dbColumnName = filedEntity . Columns . FirstOrDefault ( it = > it . PropertyName = = filedName ) . DbColumnName ;
List < IConditionalModel > wheres = new List < IConditionalModel > ( )
{
new ConditionalModel ( )
{
FieldName = dbColumnName ,
ConditionalType = ConditionalType . In ,
FieldValue = string . Join ( "," , inValues )
}
} ;
var list = this . Context . Queryable < TObject > ( ) . Where ( wheres ) . ToList ( ) ;
foreach ( var item in entitys )
{
var whereValue = item . GetType ( ) . GetProperty ( whereCol . PropertyName ) . GetValue ( item , null ) ;
var setValue = list . Where ( x = > x . GetType ( ) . GetProperty ( filedName ) . GetValue ( x , null ) . ObjToString ( ) = = whereValue . ObjToString ( ) ) . ToList ( ) ;
var setObject = item . GetType ( ) . GetProperty ( objName ) ;
if ( setObject . PropertyType . FullName . IsCollectionsList ( ) )
{
setObject . SetValue ( item , setValue . ToList ( ) , null ) ;
}
else
{
setObject . SetValue ( item , setValue . FirstOrDefault ( ) , null ) ;
}
}
} ;
Mappers . Add ( mapper ) ;
}
return this ;
}
private ISugarQueryable < T > _Mapper < TObject > ( Expression mapperObject , Expression mainField , Expression childField )
{
if ( ( mapperObject as LambdaExpression ) . Body is UnaryExpression )
{
mapperObject = ( ( mapperObject as LambdaExpression ) . Body as UnaryExpression ) . Operand ;
}
else
{
mapperObject = ( mapperObject as LambdaExpression ) . Body ;
}
if ( ( mainField as LambdaExpression ) . Body is UnaryExpression )
{
mainField = ( ( mainField as LambdaExpression ) . Body as UnaryExpression ) . Operand ;
}
else
{
mainField = ( mainField as LambdaExpression ) . Body ;
}
if ( ( childField as LambdaExpression ) . Body is UnaryExpression )
{
childField = ( ( childField as LambdaExpression ) . Body as UnaryExpression ) . Operand ;
}
else
{
childField = ( childField as LambdaExpression ) . Body ;
}
Check . Exception ( mapperObject is MemberExpression = = false | | mainField is MemberExpression = = false , ".Mapper() parameter error" ) ;
var mapperObjectExp = mapperObject as MemberExpression ;
var mainFieldExp = mainField as MemberExpression ;
var childFieldExp = childField as MemberExpression ;
Check . Exception ( mainFieldExp . Type . IsClass ( ) , ".Mapper() parameter error" ) ;
Check . Exception ( childFieldExp . Type . IsClass ( ) , ".Mapper() parameter error" ) ;
var objType = mapperObjectExp . Type ;
var filedType = mainFieldExp . Expression . Type ;
Check . Exception ( objType ! = typeof ( TObject ) & & objType ! = typeof ( List < TObject > ) , ".Mapper() parameter error" ) ;
if ( objType = = typeof ( List < TObject > ) )
{
objType = typeof ( TObject ) ;
}
var mainFiledName = mainFieldExp . Member . Name ;
var childFiledName = childFieldExp . Member . Name ;
var objName = mapperObjectExp . Member . Name ;
var filedEntity = this . Context . EntityMaintenance . GetEntityInfo ( objType ) ;
var objEntity = this . Context . EntityMaintenance . GetEntityInfo ( filedType ) ;
var isSelf = filedType = = typeof ( T ) ;
if ( Mappers = = null )
Mappers = new List < Action < List < T > > > ( ) ;
if ( isSelf )
{
Action < List < T > > mapper = ( entitys ) = >
{
if ( entitys . IsNullOrEmpty ( ) | | ! entitys . Any ( ) ) return ;
var entity = entitys . First ( ) ;
var whereCol = filedEntity . Columns . FirstOrDefault ( it = > it . PropertyName . Equals ( childFiledName , StringComparison . CurrentCultureIgnoreCase ) ) ;
if ( whereCol = = null )
{
whereCol = filedEntity . Columns . FirstOrDefault ( it = > it . IsPrimarykey = = true ) ;
}
if ( whereCol = = null )
{
whereCol = filedEntity . Columns . FirstOrDefault ( it = > GetPrimaryKeys ( ) . Any ( pk = > pk . Equals ( it . DbColumnName , StringComparison . CurrentCultureIgnoreCase ) ) ) ;
}
if ( whereCol = = null )
{
whereCol = filedEntity . Columns . FirstOrDefault ( it = > it . PropertyName . Equals ( "id" , StringComparison . CurrentCultureIgnoreCase ) ) ;
}
if ( whereCol = = null )
{
whereCol = filedEntity . Columns . FirstOrDefault ( it = > ( it . PropertyName ) . Equals ( it . EntityName + "id" , StringComparison . CurrentCultureIgnoreCase ) ) ;
}
if ( whereCol = = null )
{
Check . Exception ( true , ".Mapper() parameter error" ) ;
}
List < string > inValues = entitys . Select ( it = > it . GetType ( ) . GetProperty ( mainFiledName ) . GetValue ( it , null ) . ObjToString ( ) ) . ToList ( ) ;
List < IConditionalModel > wheres = new List < IConditionalModel > ( )
{
new ConditionalModel ( )
{
FieldName = whereCol . DbColumnName ,
ConditionalType = ConditionalType . In ,
FieldValue = string . Join ( "," , inValues . Distinct ( ) )
}
} ;
var list = this . Context . Queryable < TObject > ( ) . Where ( wheres ) . ToList ( ) ;
foreach ( var item in entitys )
{
var whereValue = item . GetType ( ) . GetProperty ( mainFiledName ) . GetValue ( item , null ) ;
var setValue = list . Where ( x = > x . GetType ( ) . GetProperty ( whereCol . PropertyName ) . GetValue ( x , null ) . ObjToString ( ) = = whereValue . ObjToString ( ) ) . ToList ( ) ;
var setObject = item . GetType ( ) . GetProperty ( objName ) ;
if ( setObject . PropertyType . FullName . IsCollectionsList ( ) )
{
setObject . SetValue ( item , setValue . ToList ( ) , null ) ;
}
else
{
setObject . SetValue ( item , setValue . FirstOrDefault ( ) , null ) ;
}
}
} ;
Mappers . Add ( mapper ) ;
}
else
{
Action < List < T > > mapper = ( entitys ) = >
{
if ( entitys . IsNullOrEmpty ( ) | | ! entitys . Any ( ) ) return ;
var entity = entitys . First ( ) ;
var tEntity = this . Context . EntityMaintenance . GetEntityInfo < T > ( ) ;
var whereCol = tEntity . Columns . FirstOrDefault ( it = > it . PropertyName . Equals ( childFiledName , StringComparison . CurrentCultureIgnoreCase ) ) ;
if ( whereCol = = null )
{
whereCol = tEntity . Columns . FirstOrDefault ( it = > it . IsPrimarykey = = true ) ;
}
if ( whereCol = = null )
{
whereCol = tEntity . Columns . FirstOrDefault ( it = > GetPrimaryKeys ( ) . Any ( pk = > pk . Equals ( it . DbColumnName , StringComparison . CurrentCultureIgnoreCase ) ) ) ;
}
if ( whereCol = = null )
{
whereCol = tEntity . Columns . FirstOrDefault ( it = > it . PropertyName . Equals ( "id" , StringComparison . CurrentCultureIgnoreCase ) ) ;
}
if ( whereCol = = null )
{
whereCol = tEntity . Columns . FirstOrDefault ( it = > ( it . PropertyName ) . Equals ( it . EntityName + "id" , StringComparison . CurrentCultureIgnoreCase ) ) ;
}
if ( whereCol = = null )
{
Check . Exception ( true , ".Mapper() parameter error" ) ;
}
List < string > inValues = entitys . Select ( it = > it . GetType ( ) . GetProperty ( whereCol . PropertyName ) . GetValue ( it , null ) . ObjToString ( ) ) . ToList ( ) ;
var dbColumnName = filedEntity . Columns . FirstOrDefault ( it = > it . PropertyName = = mainFiledName ) . DbColumnName ;
List < IConditionalModel > wheres = new List < IConditionalModel > ( )
{
new ConditionalModel ( )
{
FieldName = dbColumnName ,
ConditionalType = ConditionalType . In ,
FieldValue = string . Join ( "," , inValues )
}
} ;
var list = this . Context . Queryable < TObject > ( ) . Where ( wheres ) . ToList ( ) ;
foreach ( var item in entitys )
{
var whereValue = item . GetType ( ) . GetProperty ( whereCol . PropertyName ) . GetValue ( item , null ) ;
var setValue = list . Where ( x = > x . GetType ( ) . GetProperty ( mainFiledName ) . GetValue ( x , null ) . ObjToString ( ) = = whereValue . ObjToString ( ) ) . ToList ( ) ;
var setObject = item . GetType ( ) . GetProperty ( objName ) ;
if ( setObject . PropertyType . FullName . IsCollectionsList ( ) )
{
setObject . SetValue ( item , setValue . ToList ( ) , null ) ;
}
else
{
setObject . SetValue ( item , setValue . FirstOrDefault ( ) , null ) ;
}
}
} ;
Mappers . Add ( mapper ) ;
}
return this ;
}
2022-10-23 14:48:47 +08:00
private void SetContextModel < TResult > ( List < TResult > result , Type entityType )
2022-10-22 18:23:02 +08:00
{
2022-10-23 14:48:47 +08:00
if ( result . HasValue ( ) )
{
if ( UtilMethods . GetRootBaseType ( entityType ) . HasValue ( ) & & UtilMethods . GetRootBaseType ( entityType ) = = UtilConstants . ModelType )
{
foreach ( var item in result )
{
var contextProperty = item . GetType ( ) . GetProperty ( "Context" ) ;
SqlSugarProvider newClient = this . Context . Utilities . CopyContext ( ) ;
newClient . Ado . IsDisableMasterSlaveSeparation = true ;
if ( newClient . CurrentConnectionConfig . AopEvents = = null )
newClient . CurrentConnectionConfig . AopEvents = new AopEvents ( ) ;
contextProperty . SetValue ( item , newClient , null ) ;
}
}
}
}
#endregion
#region Mapping Type
protected void RestoreMapping ( )
{
if ( IsAs & & _RestoreMapping )
{
this . Context . MappingTables = OldMappingTableList = = null ? new MappingTableList ( ) : OldMappingTableList ;
}
}
protected void InitMapping ( )
{
if ( this . QueryableMappingTableList ! = null )
this . Context . MappingTables = this . QueryableMappingTableList ;
}
#endregion
#region Other
2022-11-27 14:25:16 +08:00
protected string AppendSelect < EntityType > ( string sql , ReadOnlyCollection < ParameterExpression > parameters , List < EntityColumnInfo > columnsResult , int parameterIndex1 )
{
var columns = this . Context . EntityMaintenance . GetEntityInfo < EntityType > ( ) . Columns ;
var parameterName = parameters [ parameterIndex1 ] ;
foreach ( var item in columns )
{
if ( item . IsIgnore = = false & & columnsResult . Any ( it = > it . PropertyName . EqualCase ( item . PropertyName ) ) & & ! sql . ToLower ( ) . Contains ( SqlBuilder . GetTranslationColumnName ( item . PropertyName . ToLower ( ) ) ) )
{
sql = $" {sql},{parameterName.Name}.{SqlBuilder.GetTranslationColumnName(item.DbColumnName)} AS {SqlBuilder.GetTranslationColumnName(item.PropertyName)} " ;
}
}
return sql ;
}
2022-10-23 14:48:47 +08:00
protected JoinQueryInfo GetJoinInfo ( Expression joinExpression , JoinType joinType )
{
QueryBuilder . CheckExpressionNew ( joinExpression , "Join" ) ;
QueryBuilder . JoinExpression = joinExpression ;
var express = LambdaExpression . Lambda ( joinExpression ) . Body ;
var lastPareamter = ( express as LambdaExpression ) . Parameters . Last ( ) ;
var expResult = this . QueryBuilder . GetExpressionValue ( joinExpression , ResolveExpressType . WhereMultiple ) ;
this . Context . InitMappingInfo ( lastPareamter . Type ) ;
var result = new JoinQueryInfo ( )
{
JoinIndex = QueryBuilder . JoinQueryInfos . Count ,
JoinType = joinType ,
JoinWhere = expResult . GetResultString ( ) ,
ShortName = lastPareamter . Name ,
TableName = this . Context . EntityMaintenance . GetTableName ( lastPareamter . Type )
} ;
2022-11-01 22:35:47 +08:00
if ( this . Context . CurrentConnectionConfig ? . MoreSettings ? . PgSqlIsAutoToLower = = false )
{
result . ShortName = this . SqlBuilder . GetTranslationColumnName ( result . ShortName ) ;
}
2022-10-23 14:48:47 +08:00
if ( result . JoinIndex = = 0 )
{
var firstPareamter = ( express as LambdaExpression ) . Parameters . First ( ) ;
this . QueryBuilder . TableShortName = firstPareamter . Name ;
if ( this . QueryBuilder . AsTables ! = null & & this . QueryBuilder . AsTables . Count = = 1 )
{
var tableinfo = this . QueryBuilder . AsTables . First ( ) ;
if ( this . QueryBuilder . TableWithString ! = SqlWith . Null & & this . Context . CurrentConnectionConfig ? . MoreSettings ? . IsWithNoLockQuery = = true & & this . QueryBuilder . AsTables . First ( ) . Value . ObjToString ( ) . Contains ( SqlWith . NoLock ) = = false )
{
this . QueryBuilder . AsTables [ tableinfo . Key ] = " (SELECT * FROM " + this . QueryBuilder . AsTables . First ( ) . Value + $" {SqlWith.NoLock} )" ;
}
else
{
this . QueryBuilder . AsTables [ tableinfo . Key ] = " (SELECT * FROM " + this . QueryBuilder . AsTables . First ( ) . Value + ")" ;
}
this . QueryBuilder . SelectValue = this . QueryBuilder . TableShortName + ".*" ;
}
}
Check . Exception ( result . JoinIndex > 10 , ErrorMessage . GetThrowMessage ( "只支持12个表" , "Only 12 tables are supported" ) ) ;
2022-10-22 18:23:02 +08:00
return result ;
}
2022-10-23 14:48:47 +08:00
protected ISugarQueryable < TResult > _Select < TResult > ( Expression expression )
2022-10-22 18:23:02 +08:00
{
2022-10-23 14:48:47 +08:00
QueryBuilder . CheckExpression ( expression , "Select" ) ;
this . Context . InitMappingInfo ( typeof ( TResult ) ) ;
var result = InstanceFactory . GetQueryable < TResult > ( this . Context . CurrentConnectionConfig ) ;
result . Context = this . Context ;
result . SqlBuilder = this . SqlBuilder ;
result . SqlBuilder . QueryBuilder . Parameters = QueryBuilder . Parameters ;
result . SqlBuilder . QueryBuilder . SelectValue = expression ;
result . SqlBuilder . QueryBuilder . IsSelectSingleFiledJson = UtilMethods . IsJsonMember ( expression , this . Context ) ;
2022-11-08 13:29:02 +08:00
result . SqlBuilder . QueryBuilder . IsSelectSingleFiledArray = UtilMethods . IsArrayMember ( expression , this . Context ) ;
2022-10-23 14:48:47 +08:00
if ( this . IsCache )
{
result . WithCache ( this . CacheTime ) ;
}
if ( this . QueryBuilder . IsSqlQuery )
{
this . QueryBuilder . IsSqlQuerySelect = true ;
}
2022-10-22 18:23:02 +08:00
return result ;
}
2022-10-23 14:48:47 +08:00
protected void _Where ( Expression expression )
{
QueryBuilder . CheckExpression ( expression , "Where" ) ;
var isSingle = QueryBuilder . IsSingle ( ) ;
var result = QueryBuilder . GetExpressionValue ( expression , isSingle ? ResolveExpressType . WhereSingle : ResolveExpressType . WhereMultiple ) ;
QueryBuilder . WhereInfos . Add ( SqlBuilder . AppendWhereOrAnd ( QueryBuilder . WhereInfos . IsNullOrEmpty ( ) , result . GetResultString ( ) ) ) ;
}
protected ISugarQueryable < T > _OrderBy ( Expression expression , OrderByType type = OrderByType . Asc )
{
QueryBuilder . CheckExpression ( expression , "OrderBy" ) ;
var isSingle = QueryBuilder . IsSingle ( ) ;
if ( expression . ToString ( ) . IsContainsIn ( "Desc(" , "Asc(" ) )
{
var orderValue = "" ;
var newExp = ( expression as LambdaExpression ) . Body as NewExpression ;
foreach ( var item in newExp . Arguments )
{
if ( item is MemberExpression )
{
orderValue + =
QueryBuilder . GetExpressionValue ( item , isSingle ? ResolveExpressType . FieldSingle : ResolveExpressType . FieldMultiple ) . GetResultString ( ) + "," ;
}
else
{
orderValue + =
QueryBuilder . GetExpressionValue ( item , isSingle ? ResolveExpressType . WhereSingle : ResolveExpressType . WhereMultiple ) . GetResultString ( ) + "," ;
}
}
orderValue = orderValue . TrimEnd ( ',' ) ;
OrderBy ( orderValue ) ;
return this ;
}
else if ( ( expression as LambdaExpression ) . Body is NewExpression )
{
var newExp = ( expression as LambdaExpression ) . Body as NewExpression ;
var result = "" ;
foreach ( var item in newExp . Arguments )
{
2022-11-08 22:31:48 +08:00
if ( item is MemberExpression & & type = = OrderByType . Asc )
2022-10-23 14:48:47 +08:00
{
result + =
QueryBuilder . GetExpressionValue ( item , isSingle ? ResolveExpressType . FieldSingle : ResolveExpressType . FieldMultiple ) . GetResultString ( ) + "," ;
}
2022-11-08 16:32:12 +08:00
else if ( type = = OrderByType . Desc )
{
result + =
2022-11-08 22:31:48 +08:00
QueryBuilder . GetExpressionValue ( item , isSingle ? ResolveExpressType . WhereSingle : ResolveExpressType . WhereMultiple ) . GetResultString ( ) + " Desc ," ;
2022-11-08 16:32:12 +08:00
}
2022-10-23 14:48:47 +08:00
else
{
result + =
QueryBuilder . GetExpressionValue ( item , isSingle ? ResolveExpressType . WhereSingle : ResolveExpressType . WhereMultiple ) . GetResultString ( ) + "," ;
}
}
result = result . TrimEnd ( ',' ) ;
OrderBy ( result ) ;
return this ;
}
else
{
var lamResult = QueryBuilder . GetExpressionValue ( expression , isSingle ? ResolveExpressType . FieldSingle : ResolveExpressType . FieldMultiple ) ;
OrderBy ( lamResult . GetResultString ( ) + UtilConstants . Space + type . ToString ( ) . ToUpper ( ) ) ;
return this ;
}
}
private void _ToOffsetPage ( int pageIndex , int pageSize )
{
QueryBuilder . Offset = $" OFFSET {(pageIndex - 1) * pageSize} ROWS FETCH NEXT {pageSize} ROWS ONLY" ;
}
private int _PageList ( int pageIndex , int pageSize )
{
if ( pageIndex = = 0 )
pageIndex = 1 ;
if ( QueryBuilder . PartitionByValue . HasValue ( ) )
{
QueryBuilder . ExternalPageIndex = pageIndex ;
QueryBuilder . ExternalPageSize = pageSize ;
}
else
{
QueryBuilder . Skip = ( pageIndex - 1 ) * pageSize ;
QueryBuilder . Take = pageSize ;
}
2022-10-22 18:23:02 +08:00
2022-10-23 14:48:47 +08:00
return pageIndex ;
}
protected ISugarQueryable < T > _GroupBy ( Expression expression )
{
QueryBuilder . CheckExpression ( expression , "GroupBy" ) ;
LambdaExpression lambda = expression as LambdaExpression ;
expression = lambda . Body ;
var isSingle = QueryBuilder . IsSingle ( ) ;
ExpressionResult lamResult = null ;
string result = null ;
if ( expression is NewExpression )
{
var newExp = expression as NewExpression ;
foreach ( var item in newExp . Arguments )
{
if ( item is MemberExpression )
{
result + =
QueryBuilder . GetExpressionValue ( item , isSingle ? ResolveExpressType . FieldSingle : ResolveExpressType . FieldMultiple ) . GetResultString ( ) + "," ;
}
else
{
result + =
QueryBuilder . GetExpressionValue ( item , isSingle ? ResolveExpressType . WhereSingle : ResolveExpressType . WhereMultiple ) . GetResultString ( ) + "," ;
}
}
result = result . TrimEnd ( ',' ) ;
}
else
{
lamResult = QueryBuilder . GetExpressionValue ( expression , isSingle ? ResolveExpressType . FieldSingle : ResolveExpressType . FieldMultiple ) ;
result = lamResult . GetResultString ( ) ;
}
GroupBy ( result ) ;
return this ;
}
protected ISugarQueryable < T > _As ( string tableName , string entityName )
{
if ( this . QueryBuilder . AsTables ! = null & & this . QueryBuilder . AsTables . Any ( it = > it . Key = = entityName ) )
{
Check . Exception ( true , ErrorMessage . GetThrowMessage ( $"use As<{tableName}>(\" { tableName } \ ")" , $"请把 As(\" { tableName } \ "), 改成 As<{tableName}实体>(\"{tableName}\")" ) ) ;
}
else
{
this . QueryBuilder . AsTables . Add ( entityName , tableName ) ;
}
return this ;
}
protected void _Filter ( string FilterName , bool isDisabledGobalFilter )
{
QueryBuilder . IsDisabledGobalFilter = isDisabledGobalFilter ;
if ( this . Context . QueryFilter . GeFilterList . HasValue ( ) & & FilterName . HasValue ( ) )
{
var list = this . Context . QueryFilter . GeFilterList . Where ( it = > it . FilterName = = FilterName & & it . IsJoinQuery = = ! QueryBuilder . IsSingle ( ) ) ;
foreach ( var item in list )
{
var filterResult = item . FilterValue ( this . Context ) ;
Where ( filterResult . Sql + UtilConstants . Space , filterResult . Parameters ) ;
}
}
}
public ISugarQueryable < T > _PartitionBy ( Expression expression )
{
QueryBuilder . CheckExpression ( expression , "PartitionBy" ) ;
LambdaExpression lambda = expression as LambdaExpression ;
expression = lambda . Body ;
var isSingle = QueryBuilder . IsSingle ( ) ;
ExpressionResult lamResult = null ;
string result = null ;
if ( expression is NewExpression )
{
lamResult = QueryBuilder . GetExpressionValue ( expression , isSingle ? ResolveExpressType . ArraySingle : ResolveExpressType . ArrayMultiple ) ;
result = string . Join ( "," , lamResult . GetResultArray ( ) ) ;
}
else
{
lamResult = QueryBuilder . GetExpressionValue ( expression , isSingle ? ResolveExpressType . FieldSingle : ResolveExpressType . FieldMultiple ) ;
result = lamResult . GetResultString ( ) ;
}
PartitionBy ( result ) ;
return this ;
}
protected ISugarQueryable < T > _Having ( Expression expression )
{
QueryBuilder . CheckExpression ( expression , "Having" ) ;
var isSingle = QueryBuilder . IsSingle ( ) ;
var lamResult = QueryBuilder . GetExpressionValue ( expression , isSingle ? ResolveExpressType . WhereSingle : ResolveExpressType . WhereMultiple ) ;
Having ( lamResult . GetResultString ( ) ) ;
return this ;
}
protected List < TResult > _ToList < TResult > ( )
{
List < TResult > result = null ;
var sqlObj = this . _ToSql ( ) ;
if ( IsCache )
{
var cacheService = this . Context . CurrentConnectionConfig . ConfigureExternalServices . DataInfoCacheService ;
result = CacheSchemeMain . GetOrCreate < List < TResult > > ( cacheService , this . QueryBuilder , ( ) = > { return GetData < TResult > ( sqlObj ) ; } , CacheTime , this . Context , CacheKey ) ;
}
else
{
result = GetData < TResult > ( sqlObj ) ;
}
RestoreMapping ( ) ;
_Mapper ( result ) ;
_InitNavigat ( result ) ;
return result ;
}
protected async Task < List < TResult > > _ToListAsync < TResult > ( )
{
List < TResult > result = null ;
var sqlObj = this . _ToSql ( ) ;
if ( IsCache )
{
var cacheService = this . Context . CurrentConnectionConfig . ConfigureExternalServices . DataInfoCacheService ;
result = CacheSchemeMain . GetOrCreate < List < TResult > > ( cacheService , this . QueryBuilder , ( ) = > { return GetData < TResult > ( sqlObj ) ; } , CacheTime , this . Context , CacheKey ) ;
}
else
{
result = await GetDataAsync < TResult > ( sqlObj ) ;
}
RestoreMapping ( ) ;
_Mapper ( result ) ;
await _InitNavigatAsync ( result ) ;
return result ;
}
2022-10-22 18:23:02 +08:00
private void ToSqlBefore ( )
{
var moreSetts = this . Context . CurrentConnectionConfig . MoreSettings ;
if ( moreSetts ! = null & & moreSetts . IsWithNoLockQuery & & string . IsNullOrEmpty ( QueryBuilder . TableWithString ) )
{
this . With ( SqlWith . NoLock ) ;
}
}
protected List < TResult > GetData < TResult > ( KeyValuePair < string , List < SugarParameter > > sqlObj )
{
List < TResult > result ;
var isComplexModel = QueryBuilder . IsComplexModel ( sqlObj . Key ) ;
var entityType = typeof ( TResult ) ;
bool isChangeQueryableSlave = GetIsSlaveQuery ( ) ;
bool isChangeQueryableMasterSlave = GetIsMasterQuery ( ) ;
var dataReader = this . Db . GetDataReader ( sqlObj . Key , sqlObj . Value . ToArray ( ) ) ;
result = GetData < TResult > ( isComplexModel , entityType , dataReader ) ;
RestChangeMasterQuery ( isChangeQueryableMasterSlave ) ;
RestChangeSlaveQuery ( isChangeQueryableSlave ) ;
return result ;
}
protected async Task < List < TResult > > GetDataAsync < TResult > ( KeyValuePair < string , List < SugarParameter > > sqlObj )
{
List < TResult > result ;
var isComplexModel = QueryBuilder . IsComplexModel ( sqlObj . Key ) ;
var entityType = typeof ( TResult ) ;
bool isChangeQueryableSlave = GetIsSlaveQuery ( ) ;
bool isChangeQueryableMasterSlave = GetIsMasterQuery ( ) ;
var dataReader = await this . Db . GetDataReaderAsync ( sqlObj . Key , sqlObj . Value . ToArray ( ) ) ;
result = await GetDataAsync < TResult > ( isComplexModel , entityType , dataReader ) ;
RestChangeMasterQuery ( isChangeQueryableMasterSlave ) ;
RestChangeSlaveQuery ( isChangeQueryableSlave ) ;
return result ;
}
private List < TResult > GetData < TResult > ( bool isComplexModel , Type entityType , IDataReader dataReader )
{
List < TResult > result ;
if ( entityType = = UtilConstants . DynamicType )
{
result = this . Context . Utilities . DataReaderToExpandoObjectList ( dataReader ) as List < TResult > ;
}
else if ( entityType = = UtilConstants . ObjType )
{
result = this . Context . Utilities . DataReaderToExpandoObjectList ( dataReader ) . Select ( it = > ( ( TResult ) ( object ) it ) ) . ToList ( ) ;
}
else if ( QueryBuilder . IsSelectSingleFiledJson )
{
result = this . Context . Utilities . DataReaderToSelectJsonList < TResult > ( dataReader ) ;
}
2022-11-08 13:29:02 +08:00
else if ( QueryBuilder . IsSelectSingleFiledArray )
{
result = this . Context . Utilities . DataReaderToSelectArrayList < TResult > ( dataReader ) ;
}
2022-10-22 18:23:02 +08:00
else if ( entityType . IsAnonymousType ( ) | | isComplexModel )
{
result = this . Context . Utilities . DataReaderToList < TResult > ( dataReader ) ;
}
else
{
result = this . Bind . DataReaderToList < TResult > ( entityType , dataReader ) ;
}
SetContextModel ( result , entityType ) ;
return result ;
}
private async Task < List < TResult > > GetDataAsync < TResult > ( bool isComplexModel , Type entityType , IDataReader dataReader )
{
List < TResult > result ;
if ( entityType = = UtilConstants . DynamicType )
{
result = await this . Context . Utilities . DataReaderToExpandoObjectListAsync ( dataReader ) as List < TResult > ;
}
else if ( entityType = = UtilConstants . ObjType )
{
var expObj = await this . Context . Utilities . DataReaderToExpandoObjectListAsync ( dataReader ) ;
result = expObj . Select ( it = > ( ( TResult ) ( object ) it ) ) . ToList ( ) ;
}
else if ( QueryBuilder . IsSelectSingleFiledJson )
{
result = await this . Context . Utilities . DataReaderToSelectJsonListAsync < TResult > ( dataReader ) ;
}
2022-11-08 19:34:03 +08:00
else if ( QueryBuilder . IsSelectSingleFiledArray )
{
result = await this . Context . Utilities . DataReaderToSelectArrayListAsync < TResult > ( dataReader ) ;
}
2022-10-22 18:23:02 +08:00
else if ( entityType . IsAnonymousType ( ) | | isComplexModel )
{
result = await this . Context . Utilities . DataReaderToListAsync < TResult > ( dataReader ) ;
}
else
{
result = await this . Bind . DataReaderToListAsync < TResult > ( entityType , dataReader ) ;
}
SetContextModel ( result , entityType ) ;
return result ;
}
protected void _InQueryable ( Expression expression , KeyValuePair < string , List < SugarParameter > > sqlObj )
{
QueryBuilder . CheckExpression ( expression , "In" ) ;
string sql = sqlObj . Key ;
if ( sqlObj . Value . HasValue ( ) )
{
this . SqlBuilder . RepairReplicationParameters ( ref sql , sqlObj . Value . ToArray ( ) , 100 ) ;
this . QueryBuilder . Parameters . AddRange ( sqlObj . Value ) ;
}
var isSingle = QueryBuilder . IsSingle ( ) ;
var lamResult = QueryBuilder . GetExpressionValue ( expression , isSingle ? ResolveExpressType . FieldSingle : ResolveExpressType . FieldMultiple ) ;
var fieldName = lamResult . GetResultString ( ) ;
var whereSql = string . Format ( this . QueryBuilder . InTemplate , fieldName , sql ) ;
this . QueryBuilder . WhereInfos . Add ( SqlBuilder . AppendWhereOrAnd ( this . QueryBuilder . WhereInfos . IsNullOrEmpty ( ) , whereSql ) ) ;
base . _InQueryableIndex + = 100 ;
}
protected List < string > GetPrimaryKeys ( )
{
if ( this . Context . IsSystemTablesConfig )
{
return this . Context . DbMaintenance . GetPrimaries ( this . Context . EntityMaintenance . GetTableName ( this . EntityInfo . EntityName ) ) ;
}
else
{
return this . EntityInfo . Columns . Where ( it = > it . IsPrimarykey ) . Select ( it = > it . DbColumnName ) . ToList ( ) ;
}
}
protected virtual List < string > GetIdentityKeys ( )
{
if ( this . Context . IsSystemTablesConfig )
{
return this . Context . DbMaintenance . GetIsIdentities ( this . EntityInfo . DbTableName ) ;
}
else
{
return this . EntityInfo . Columns . Where ( it = > it . IsIdentity ) . Select ( it = > it . DbColumnName ) . ToList ( ) ;
}
}
protected void CopyQueryBuilder ( QueryBuilder asyncQueryableBuilder )
{
var pars = new List < SugarParameter > ( ) ;
if ( this . QueryBuilder . Parameters ! = null )
{
pars = this . QueryBuilder . Parameters . Select ( it = > new SugarParameter ( it . ParameterName , it . Value )
{
DbType = it . DbType ,
Value = it . Value ,
ParameterName = it . ParameterName ,
Direction = it . Direction ,
IsArray = it . IsArray ,
IsJson = it . IsJson ,
IsNullable = it . IsNullable ,
IsRefCursor = it . IsRefCursor ,
Size = it . Size ,
SourceColumn = it . SourceColumn ,
SourceColumnNullMapping = it . SourceColumnNullMapping ,
SourceVersion = it . SourceVersion ,
TempDate = it . TempDate ,
TypeName = it . TypeName ,
UdtTypeName = it . UdtTypeName ,
_Size = it . _Size
} ) . ToList ( ) ;
}
asyncQueryableBuilder . IsEnableMasterSlaveSeparation = this . QueryBuilder . IsEnableMasterSlaveSeparation ;
asyncQueryableBuilder . TranLock = this . QueryBuilder . TranLock ;
asyncQueryableBuilder . IsDisableMasterSlaveSeparation = this . QueryBuilder . IsDisableMasterSlaveSeparation ;
asyncQueryableBuilder . IsQueryInQuery = this . QueryBuilder . IsQueryInQuery ;
asyncQueryableBuilder . Includes = this . QueryBuilder . Includes ;
asyncQueryableBuilder . Take = this . QueryBuilder . Take ;
asyncQueryableBuilder . Skip = this . QueryBuilder . Skip ;
asyncQueryableBuilder . SelectValue = this . QueryBuilder . SelectValue ;
asyncQueryableBuilder . WhereInfos = this . Context . Utilities . TranslateCopy ( this . QueryBuilder . WhereInfos ) ;
asyncQueryableBuilder . EasyJoinInfos = this . Context . Utilities . TranslateCopy ( this . QueryBuilder . EasyJoinInfos ) ;
asyncQueryableBuilder . JoinQueryInfos = this . Context . Utilities . TranslateCopy ( this . QueryBuilder . JoinQueryInfos ) ;
asyncQueryableBuilder . WhereIndex = this . QueryBuilder . WhereIndex ;
asyncQueryableBuilder . EntityType = this . QueryBuilder . EntityType ;
asyncQueryableBuilder . EntityName = this . QueryBuilder . EntityName ;
asyncQueryableBuilder . Parameters = pars ;
asyncQueryableBuilder . TableShortName = this . QueryBuilder . TableShortName ;
asyncQueryableBuilder . TableWithString = this . QueryBuilder . TableWithString ;
asyncQueryableBuilder . GroupByValue = this . QueryBuilder . GroupByValue ;
asyncQueryableBuilder . IsDistinct = this . QueryBuilder . IsDistinct ;
asyncQueryableBuilder . OrderByValue = this . QueryBuilder . OrderByValue ;
asyncQueryableBuilder . IsDisabledGobalFilter = this . QueryBuilder . IsDisabledGobalFilter ;
asyncQueryableBuilder . PartitionByValue = this . QueryBuilder . PartitionByValue ;
asyncQueryableBuilder . JoinExpression = this . QueryBuilder . JoinExpression ;
asyncQueryableBuilder . WhereIndex = this . QueryBuilder . WhereIndex ;
asyncQueryableBuilder . HavingInfos = this . QueryBuilder . HavingInfos ;
asyncQueryableBuilder . LambdaExpressions . ParameterIndex = this . QueryBuilder . LambdaExpressions . ParameterIndex ;
asyncQueryableBuilder . IgnoreColumns = this . Context . Utilities . TranslateCopy ( this . QueryBuilder . IgnoreColumns ) ;
asyncQueryableBuilder . AsTables = this . Context . Utilities . TranslateCopy ( this . QueryBuilder . AsTables ) ;
asyncQueryableBuilder . DisableTop = this . QueryBuilder . DisableTop ;
asyncQueryableBuilder . Offset = this . QueryBuilder . Offset ;
asyncQueryableBuilder . IsSqlQuery = this . QueryBuilder . IsSqlQuery ;
asyncQueryableBuilder . IsSqlQuerySelect = this . QueryBuilder . IsSqlQuerySelect ;
asyncQueryableBuilder . OldSql = this . QueryBuilder . OldSql ;
asyncQueryableBuilder . IsCrossQueryWithAttr = this . QueryBuilder . IsCrossQueryWithAttr ;
asyncQueryableBuilder . CrossQueryItems = this . QueryBuilder . CrossQueryItems ;
}
protected int SetCacheTime ( int cacheDurationInSeconds )
{
if ( cacheDurationInSeconds = = int . MaxValue & & this . Context . CurrentConnectionConfig . MoreSettings ! = null & & this . Context . CurrentConnectionConfig . MoreSettings . DefaultCacheDurationInSeconds > 0 )
{
cacheDurationInSeconds = this . Context . CurrentConnectionConfig . MoreSettings . DefaultCacheDurationInSeconds ;
}
return cacheDurationInSeconds ;
}
2022-10-23 14:48:47 +08:00
public virtual KeyValuePair < string , List < SugarParameter > > _ToSql ( )
{
InitMapping ( ) ;
ToSqlBefore ( ) ;
string sql = QueryBuilder . ToSqlString ( ) ;
RestoreMapping ( ) ;
return new KeyValuePair < string , List < SugarParameter > > ( sql , QueryBuilder . Parameters ) ;
2022-10-24 14:41:23 +08:00
}
2022-10-23 14:48:47 +08:00
#endregion
2022-10-22 18:23:02 +08:00
}
}