@@ -16,8 +16,6 @@ public DataSourceExpressionBuilder(Expression expr, DataSourceLoadContext contex
1616 Context = context ;
1717 }
1818
19- Type ItemType => Expr . Type . GenericTypeArguments [ 0 ] ;
20-
2119 public Expression BuildLoadExpr ( bool paginate , IList filterOverride = null , IReadOnlyList < string > selectOverride = null ) {
2220 AddFilter ( filterOverride ) ;
2321 AddSort ( ) ;
@@ -52,16 +50,16 @@ public Expression BuildGroupCountExpr() {
5250 void AddFilter ( IList filterOverride = null ) {
5351 if ( filterOverride != null || Context . HasFilter ) {
5452 var filterExpr = filterOverride != null && filterOverride . Count < 1
55- ? Expression . Lambda ( Expression . Constant ( false ) , Expression . Parameter ( ItemType ) )
56- : new FilterExpressionCompiler ( ItemType , Context . GuardNulls , Context . UseStringToLower ) . Compile ( filterOverride ?? Context . Filter ) ;
53+ ? Expression . Lambda ( Expression . Constant ( false ) , Expression . Parameter ( GetItemType ( ) ) )
54+ : new FilterExpressionCompiler ( GetItemType ( ) , Context . GuardNulls , Context . UseStringToLower ) . Compile ( filterOverride ?? Context . Filter ) ;
5755
5856 Expr = QueryableCall ( nameof ( Queryable . Where ) , Expression . Quote ( filterExpr ) ) ;
5957 }
6058 }
6159
6260 void AddSort ( ) {
6361 if ( Context . HasAnySort )
64- Expr = new SortExpressionCompiler ( ItemType , Context . GuardNulls ) . Compile ( Expr , Context . GetFullSort ( ) ) ;
62+ Expr = new SortExpressionCompiler ( GetItemType ( ) , Context . GuardNulls ) . Compile ( Expr , Context . GetFullSort ( ) ) ;
6563 }
6664
6765 void AddSelect ( IReadOnlyList < string > selectOverride = null ) {
@@ -79,7 +77,7 @@ void AddPaging() {
7977
8078 void AddRemoteGrouping ( bool suppressGroups , bool suppressTotals ) {
8179 var compiler = new RemoteGroupExpressionCompiler (
82- ItemType , Context . GuardNulls , Context . ExpandLinqSumType , Context . CreateAnonTypeNewTweaks ( ) ,
80+ GetItemType ( ) , Context . GuardNulls , Context . ExpandLinqSumType , Context . CreateAnonTypeNewTweaks ( ) ,
8381 suppressGroups ? null : Context . Group ,
8482 suppressTotals ? null : Context . TotalSummary ,
8583 suppressGroups ? null : Context . GroupSummary
@@ -92,13 +90,27 @@ void AddCount() {
9290 }
9391
9492 SelectExpressionCompiler CreateSelectCompiler ( )
95- => new SelectExpressionCompiler ( ItemType , Context . GuardNulls , Context . CreateAnonTypeNewTweaks ( ) ) ;
93+ => new SelectExpressionCompiler ( GetItemType ( ) , Context . GuardNulls , Context . CreateAnonTypeNewTweaks ( ) ) ;
9694
9795 Expression QueryableCall ( string methodName )
98- => Expression . Call ( typeof ( Queryable ) , methodName , Expr . Type . GenericTypeArguments , Expr ) ;
96+ => Expression . Call ( typeof ( Queryable ) , methodName , GetQueryableGenericArguments ( ) , Expr ) ;
9997
10098 Expression QueryableCall ( string methodName , Expression arg )
101- => Expression . Call ( typeof ( Queryable ) , methodName , Expr . Type . GenericTypeArguments , Expr , arg ) ;
99+ => Expression . Call ( typeof ( Queryable ) , methodName , GetQueryableGenericArguments ( ) , Expr , arg ) ;
100+
101+ Type [ ] GetQueryableGenericArguments ( ) {
102+ const string queryable1 = "IQueryable`1" ;
103+ var type = Expr . Type ;
104+
105+ if ( type . IsInterface && type . Name == queryable1 )
106+ return type . GenericTypeArguments ;
107+
108+ return type . GetInterface ( queryable1 ) . GenericTypeArguments ;
109+ }
110+
111+ Type GetItemType ( )
112+ => GetQueryableGenericArguments ( ) . First ( ) ;
113+
102114 }
103115
104116}
0 commit comments