99
1010namespace SolrNet . Linq
1111{
12- public class SolrQueryProvider < TEntity , TDocument > : IQueryProvider , IAsyncProvider < TEntity >
12+ public class SolrQueryProvider < TEntity > : IQueryProvider , IAsyncProvider < TEntity >
1313 {
14- public ISolrBasicReadOnlyOperations < TDocument > Operations { get ; }
14+ public ISolrBasicReadOnlyOperations < TEntity > Operations { get ; }
1515 public SolrNetLinqOptions Options { get ; }
1616
17- public SolrQueryProvider ( ISolrBasicReadOnlyOperations < TDocument > operations , SolrNetLinqOptions options , MemberContext context = null )
17+ public SolrQueryProvider ( ISolrBasicReadOnlyOperations < TEntity > operations , SolrNetLinqOptions options , MemberContext context )
1818 {
1919 Operations = operations ?? throw new ArgumentNullException ( nameof ( operations ) ) ;
2020 Options = options ?? throw new ArgumentNullException ( nameof ( options ) ) ;
@@ -28,8 +28,7 @@ public SolrQueryProvider(ISolrBasicReadOnlyOperations<TDocument> operations, Sol
2828 else
2929 {
3030 this . MemberContext = context ;
31- }
32-
31+ }
3332 }
3433
3534 public IQueryable CreateQuery ( Expression expression )
@@ -38,30 +37,27 @@ public IQueryable CreateQuery(Expression expression)
3837
3938 if ( elementType == typeof ( TEntity ) )
4039 {
41- return new SolrQuery < TEntity , TDocument > ( this , expression ) ;
40+ return new SolrQuery < TEntity > ( this , expression ) ;
4241 }
4342
4443 if ( expression is MethodCallExpression se )
4544 {
4645 if ( se . Arguments . Count > 1 && se . Method . DeclaringType == typeof ( Queryable ) &&
4746 se . Method . Name == nameof ( Queryable . Select ) )
4847 {
49- if ( typeof ( TEntity ) == typeof ( TDocument ) )
50- {
51- return ( IQueryable ) Activator . CreateInstance (
52- typeof ( SolrQuery < , > ) . MakeGenericType ( elementType , typeof ( TDocument ) ) , new object [ ]
53- {
54- Activator . CreateInstance (
55- typeof ( SelectQueryProvider < , > ) . MakeGenericType ( elementType , typeof ( TDocument ) ) , new object [ ]
56- {
57- this . Operations ,
58- this . Options ,
59- se ,
60- this . MemberContext
61- } ) ,
62- expression
63- } ) ;
64- }
48+ return ( IQueryable ) Activator . CreateInstance (
49+ typeof ( SolrQuery < > ) . MakeGenericType ( elementType ) , new object [ ]
50+ {
51+ Activator . CreateInstance (
52+ typeof ( SolrQueryProvider < > ) . MakeGenericType ( elementType ) ,
53+ new object [ ]
54+ {
55+ this . Operations ,
56+ this . Options ,
57+ this . MemberContext
58+ } ) ,
59+ expression
60+ } ) ;
6561 }
6662 }
6763
@@ -71,46 +67,19 @@ public IQueryable CreateQuery(Expression expression)
7167 public IQueryable < TElement > CreateQuery < TElement > ( Expression expression )
7268 {
7369 return ( IQueryable < TElement > ) this . CreateQuery ( expression ) ;
74- //if (typeof(TEntity) == typeof(TElement))
75- //{
76- // return new SolrQuery<TElement, TDocument>(this as SolrQueryProvider<TElement, TDocument>, expression);
77- //}
78-
79- //if (expression is MethodCallExpression se)
80- //{
81- // if (se.Arguments.Count > 1 && se.Method.DeclaringType == typeof(Queryable) &&
82- // se.Method.Name == nameof(Queryable.Select))
83- // {
84- // if (typeof(TEntity) == typeof(TDocument))
85- // {
86- // return new SolrQuery<TElement, TDocument>(
87- // new SelectQueryProvider<TElement, TDocument>(this.Operations, this.Options,
88- // se), expression);
89- // }
90- // }
91- //}
92-
93- //throw new InvalidOperationException();
9470 }
9571
9672 public object Execute ( Expression expression )
9773 {
98- Tuple < ISolrQuery , QueryOptions , EnumeratedResult > result = TranslateAndCallBack ( expression ) ;
74+ Tuple < ISolrQuery , QueryOptions , EnumeratedResult > result = Translate ( expression ) ;
9975
100- SolrQueryResults < TDocument > solrQueryResults =
76+ SolrQueryResults < TEntity > solrQueryResults =
10177 Operations . Query ( this . Options . MainQuery ?? result . Item1 , result . Item2 ) ;
10278
10379 return HandleResults ( result , solrQueryResults ) ;
10480 }
10581
106- private object HandleResults ( Tuple < ISolrQuery , QueryOptions , EnumeratedResult > result , SolrQueryResults < TDocument > solrQueryResults )
107- {
108- object results = HandleEnumerateResults ( result , solrQueryResults ) ;
109-
110- return CastToEntityType ( results ) ;
111- }
112-
113- private static object HandleEnumerateResults ( Tuple < ISolrQuery , QueryOptions , EnumeratedResult > result , SolrQueryResults < TDocument > solrQueryResults )
82+ private object HandleResults ( Tuple < ISolrQuery , QueryOptions , EnumeratedResult > result , SolrQueryResults < TEntity > solrQueryResults )
11483 {
11584 switch ( result . Item3 )
11685 {
@@ -120,63 +89,27 @@ private static object HandleEnumerateResults(Tuple<ISolrQuery, QueryOptions, Enu
12089 case EnumeratedResult . SingleOrDefault : return solrQueryResults . SingleOrDefault ( ) ;
12190 case EnumeratedResult . Any : return solrQueryResults . NumFound > 0 ;
12291 case EnumeratedResult . Count : return solrQueryResults . NumFound ;
123- case EnumeratedResult . LongCount : return ( long ) solrQueryResults . NumFound ;
92+ case EnumeratedResult . LongCount : return ( long ) solrQueryResults . NumFound ;
12493
12594 default : return solrQueryResults ;
12695 }
12796 }
12897
129- private object CastToEntityType ( object document )
130- {
131- if ( document == null )
132- {
133- return null ;
134- }
135- else if ( document is SolrQueryResults < TDocument > sqr )
136- {
137- if ( typeof ( TEntity ) != typeof ( TDocument ) )
138- {
139- // Entity type not equal document type due to select expression. Try to cast to IEnumerable
140- return sqr . Select ( GetEntity ) . ToList ( ) ;
141- }
142- }
143- else if ( document is TDocument doc )
144- {
145- if ( typeof ( TEntity ) != typeof ( TDocument ) )
146- {
147- return GetEntity ( doc ) ;
148- }
149- }
150-
151- return document ;
152- }
153-
154- protected virtual TEntity GetEntity ( TDocument document )
155- {
156- throw new NotImplementedException ( ) ;
157- }
158-
159- private Tuple < ISolrQuery , QueryOptions , EnumeratedResult > TranslateAndCallBack ( Expression expression )
160- {
161- Tuple < ISolrQuery , QueryOptions , EnumeratedResult > result = Translate ( expression ) ;
162- this . Options . SetupQueryOptions ? . Invoke ( result . Item2 ) ;
163- return result ;
164- }
165-
166- public virtual Tuple < ISolrQuery , QueryOptions , EnumeratedResult > Translate ( Expression expression )
98+ private Tuple < ISolrQuery , QueryOptions , EnumeratedResult > Translate ( Expression expression )
16799 {
168100 SolrQueryTranslator translator = new SolrQueryTranslator ( this . Options , this . MemberContext ) ;
169101 Tuple < ISolrQuery , QueryOptions , EnumeratedResult > result = translator . Translate ( this , expression ) ;
102+ this . Options . SetupQueryOptions ? . Invoke ( result . Item2 ) ;
170103 return result ;
171104 }
172-
105+
173106 public MemberContext MemberContext { get ; set ; }
174107
175108 public async Task < object > ExecuteAsync ( Expression expression )
176109 {
177- Tuple < ISolrQuery , QueryOptions , EnumeratedResult > result = TranslateAndCallBack ( expression ) ;
110+ Tuple < ISolrQuery , QueryOptions , EnumeratedResult > result = Translate ( expression ) ;
178111
179- SolrQueryResults < TDocument > solrQueryResults =
112+ SolrQueryResults < TEntity > solrQueryResults =
180113 await Operations . QueryAsync ( this . Options . MainQuery ?? result . Item1 , result . Item2 ) ;
181114
182115 return HandleResults ( result , solrQueryResults ) ;
0 commit comments