66
77namespace MockQueryable . Core
88{
9- public abstract class TestQueryProvider < T , TExpressionVisitor > : IOrderedQueryable < T > , IQueryProvider
10- where TExpressionVisitor : ExpressionVisitor , new ( )
11- {
12- private IEnumerable < T > _enumerable ;
9+ public abstract class TestQueryProvider < T , TExpressionVisitor > : IOrderedQueryable < T > , IQueryProvider
10+ where TExpressionVisitor : ExpressionVisitor , new ( )
11+ {
12+ private IEnumerable < T > _enumerable ;
1313
14- protected TestQueryProvider ( Expression expression )
15- {
16- Expression = expression ;
17- }
14+ protected TestQueryProvider ( Expression expression )
15+ {
16+ Expression = expression ;
17+ }
1818
19- protected TestQueryProvider ( IEnumerable < T > enumerable )
20- {
21- _enumerable = enumerable ;
22- Expression = enumerable . AsQueryable ( ) . Expression ;
23- }
19+ protected TestQueryProvider ( IEnumerable < T > enumerable )
20+ {
21+ _enumerable = enumerable ;
22+ Expression = enumerable . AsQueryable ( ) . Expression ;
23+ }
2424
25- public IQueryable CreateQuery ( Expression expression )
26- {
27- if ( expression is MethodCallExpression m )
28- {
29- var resultType = m . Method . ReturnType ; // it should be IQueryable<T>
30- var tElement = resultType . GetGenericArguments ( ) . First ( ) ;
31- return ( IQueryable ) CreateInstance ( tElement , expression ) ;
32- }
25+ public IQueryable CreateQuery ( Expression expression )
26+ {
27+ if ( expression is MethodCallExpression m )
28+ {
29+ var resultType = m . Method . ReturnType ; // it should be IQueryable<T>
30+ var tElement = resultType . GetGenericArguments ( ) . First ( ) ;
31+ return ( IQueryable ) CreateInstance ( tElement , expression ) ;
32+ }
3333
34- return CreateQuery < T > ( expression ) ;
35- }
34+ return CreateQuery < T > ( expression ) ;
35+ }
3636
37- public IQueryable < TEntity > CreateQuery < TEntity > ( Expression expression )
38- {
39- return ( IQueryable < TEntity > ) CreateInstance ( typeof ( TEntity ) , expression ) ;
40- }
37+ public IQueryable < TEntity > CreateQuery < TEntity > ( Expression expression )
38+ {
39+ return ( IQueryable < TEntity > ) CreateInstance ( typeof ( TEntity ) , expression ) ;
40+ }
4141
42- private object CreateInstance ( Type tElement , Expression expression )
43- {
44- var queryType = GetType ( ) . GetGenericTypeDefinition ( ) . MakeGenericType ( tElement , typeof ( TExpressionVisitor ) ) ;
45- return Activator . CreateInstance ( queryType , expression ) ;
46- }
42+ private object CreateInstance ( Type tElement , Expression expression )
43+ {
44+ var queryType = GetType ( ) . GetGenericTypeDefinition ( ) . MakeGenericType ( tElement , typeof ( TExpressionVisitor ) ) ;
45+ return Activator . CreateInstance ( queryType , expression ) ;
46+ }
4747
48- public object Execute ( Expression expression )
49- {
50- return CompileExpressionItem < object > ( expression ) ;
51- }
48+ public object Execute ( Expression expression )
49+ {
50+ return CompileExpressionItem < object > ( expression ) ;
51+ }
5252
53- public TResult Execute < TResult > ( Expression expression )
54- {
55- return CompileExpressionItem < TResult > ( expression ) ;
56- }
53+ public TResult Execute < TResult > ( Expression expression )
54+ {
55+ return CompileExpressionItem < TResult > ( expression ) ;
56+ }
5757
58- IEnumerator < T > IEnumerable < T > . GetEnumerator ( )
59- {
60- if ( _enumerable == null ) _enumerable = CompileExpressionItem < IEnumerable < T > > ( Expression ) ;
61- return _enumerable . GetEnumerator ( ) ;
62- }
58+ IEnumerator < T > IEnumerable < T > . GetEnumerator ( )
59+ {
60+ if ( _enumerable == null ) _enumerable = CompileExpressionItem < IEnumerable < T > > ( Expression ) ;
61+ return _enumerable . GetEnumerator ( ) ;
62+ }
6363
64- IEnumerator IEnumerable . GetEnumerator ( )
65- {
66- if ( _enumerable == null ) _enumerable = CompileExpressionItem < IEnumerable < T > > ( Expression ) ;
67- return _enumerable . GetEnumerator ( ) ;
68- }
64+ IEnumerator IEnumerable . GetEnumerator ( )
65+ {
66+ if ( _enumerable == null ) _enumerable = CompileExpressionItem < IEnumerable < T > > ( Expression ) ;
67+ return _enumerable . GetEnumerator ( ) ;
68+ }
6969
70- public Type ElementType => typeof ( T ) ;
70+ public Type ElementType => typeof ( T ) ;
7171
72- public Expression Expression { get ; }
72+ public Expression Expression { get ; }
7373
74- public IQueryProvider Provider => this ;
74+ public IQueryProvider Provider => this ;
7575
76- private static TResult CompileExpressionItem < TResult > ( Expression expression )
77- {
78- var visitor = new TExpressionVisitor ( ) ;
79- var body = visitor . Visit ( expression ) ;
80- var f = Expression . Lambda < Func < TResult > > ( body ?? throw new InvalidOperationException ( $ "{ nameof ( body ) } is null") , ( IEnumerable < ParameterExpression > ) null ) ;
81- return f . Compile ( ) ( ) ;
82- }
83- }
76+ private static TResult CompileExpressionItem < TResult > ( Expression expression )
77+ {
78+ var visitor = new TExpressionVisitor ( ) ;
79+ var body = visitor . Visit ( expression ) ;
80+ var f = Expression . Lambda < Func < TResult > > (
81+ body ?? throw new InvalidOperationException ( $ "{ nameof ( body ) } is null") ,
82+ ( IEnumerable < ParameterExpression > ) null ) ;
83+ return f . Compile ( ) ( ) ;
84+ }
85+ }
8486}
0 commit comments