@@ -141,15 +141,129 @@ public void AnonymousClassSolrResult()
141141 [ Fact ]
142142 public void SelectDerivedWithCast ( )
143143 {
144- IQueryable < DerivedProduct > derivedProducts = Product . SolrOperations . Value . AsQueryable ( ) . Where ( p => p . Id != null )
145- . Select ( p => new DerivedProduct { Id2 = p . Id } ) . Where ( p => p . Id2 != null ) ;
144+ IQueryable < DerivedProduct > derivedProducts = Product . SolrOperations . Value . AsQueryable ( )
145+ . Where ( p => p . Id != null && p . Categories . Any ( ) )
146+ . Select ( p => new DerivedProduct { Id2 = p . Id , Categories = p . Categories } )
147+ . Where ( p => p . Id2 != null ) ;
146148
147149 IQueryable < Product > q2 = derivedProducts . Cast < Product > ( ) ;
148150
149151 var t1 = q2 . ToSolrQueryResults ( ) ;
150152
151153 Assert . NotNull ( t1 ) ;
152- Assert . NotNull ( t1 [ 0 ] . Id ) ;
154+ Assert . NotNull ( t1 [ 0 ] . Categories ) ;
155+ Assert . Null ( t1 [ 0 ] . Id ) ;
156+ Assert . True ( t1 . NumFound > 0 ) ;
157+ }
158+
159+ [ Fact ]
160+ public void SelectDerivedWithCastToInterface ( )
161+ {
162+ IQueryable < DerivedProduct > derivedProducts = Product . SolrOperations . Value . AsQueryable ( )
163+ . Where ( p => p . Id != null && p . Categories . Any ( ) )
164+ . Select ( p => new DerivedProduct { Id2 = p . Id , Categories = p . Categories } )
165+ . Where ( p => p . Id2 != null ) ;
166+
167+ IQueryable < IProduct > q2 = derivedProducts . Cast < IProduct > ( ) ;
168+
169+ SolrQueryResults < IProduct > t1 = q2 . ToSolrQueryResults ( ) ;
170+
171+ Assert . NotNull ( t1 ) ;
172+ Assert . NotNull ( t1 [ 0 ] . Categories ) ;
173+ Assert . Null ( t1 [ 0 ] . Id ) ;
174+ Assert . True ( t1 . NumFound > 0 ) ;
175+ }
176+
177+ [ Fact ]
178+ public void SelectDerivedWithDoubleCast ( )
179+ {
180+ IQueryable < DerivedDerivedProduct > derivedProducts = Product . SolrOperations . Value . AsQueryable ( )
181+ . Where ( p => p . Id != null && p . Categories . Any ( ) )
182+ . Select ( p => new DerivedDerivedProduct { Id2 = p . Id , Id3 = p . Id , Categories = p . Categories } )
183+ . Where ( p => p . Id3 != null ) ;
184+
185+ IQueryable < Product > q2 = derivedProducts . Cast < DerivedProduct > ( ) . Cast < Product > ( ) ;
186+
187+ var t1 = q2 . ToSolrQueryResults ( ) ;
188+
189+ Assert . NotNull ( t1 ) ;
190+ Assert . NotNull ( t1 [ 0 ] . Categories ) ;
191+ Assert . Null ( t1 [ 0 ] . Id ) ;
192+ Assert . True ( t1 . NumFound > 0 ) ;
193+ }
194+
195+ [ Fact ]
196+ public void FilterAfterCastNotWorking ( )
197+ {
198+ IQueryable < DerivedDerivedProduct > derivedProducts = Product . SolrOperations . Value . AsQueryable ( )
199+ . Where ( p => p . Id != null && p . Categories . Any ( ) )
200+ . Select ( p => new DerivedDerivedProduct { Id2 = p . Id , Id3 = p . Id , Categories = p . Categories } )
201+ . Where ( p => p . Id3 != null ) ;
202+
203+ IQueryable < Product > q2 = derivedProducts . Cast < Product > ( ) . Where ( p => p . Id != null ) ;
204+
205+ Assert . Throws < InvalidOperationException > ( ( ) => q2 . ToSolrQueryResults ( ) ) ;
206+ }
207+
208+ [ Fact ]
209+ public void CastToWrongTypeNotWorking ( )
210+ {
211+ IQueryable < DerivedProduct > derivedProducts = Product . SolrOperations . Value . AsQueryable ( )
212+ . Where ( p => p . Id != null && p . Categories . Any ( ) )
213+ . Select ( p => new DerivedProduct { Id2 = p . Id , Categories = p . Categories } )
214+ . Where ( p => p . Id2 != null ) ;
215+
216+ var q2 = derivedProducts . Cast < DerivedDerivedProduct > ( ) ;
217+
218+ Assert . Throws < InvalidCastException > ( ( ) => q2 . ToSolrQueryResults ( ) ) ;
219+ }
220+
221+ [ Fact ]
222+ public void MethodsWhichNotNeedContextWorksAfterCast ( )
223+ {
224+ IQueryable < DerivedDerivedProduct > derivedProducts = Product . SolrOperations . Value . AsQueryable ( )
225+ . Where ( p => p . Id != null && p . Categories . Any ( ) )
226+ . Select ( p => new DerivedDerivedProduct { Id2 = p . Id , Id3 = p . Id , Categories = p . Categories } )
227+ . Where ( p => p . Id3 != null ) ;
228+
229+ Product q2 = derivedProducts . Cast < Product > ( ) . Skip ( 1 ) . Take ( 1 ) . FirstOrDefault ( ) ;
230+
231+ Assert . NotNull ( q2 ) ;
232+ }
233+
234+ [ Fact ]
235+ public void SelectMultipleCopiesOfField ( )
236+ {
237+ IQueryable < DerivedDerivedProduct > q1 = Product . SolrOperations . Value . AsQueryable ( )
238+ . Where ( p => p . Id != null && p . Categories . Any ( ) )
239+ . Select ( p => new DerivedDerivedProduct { Id2 = p . Id , Id3 = p . Id , Categories = p . Categories } )
240+ . Where ( p => p . Id2 != null ) ;
241+
242+ var t1 = q1 . ToSolrQueryResults ( ) ;
243+
244+ Assert . NotNull ( t1 ) ;
245+ Assert . NotNull ( t1 [ 0 ] . Id2 ) ;
246+ Assert . Equal ( t1 [ 0 ] . Id2 , t1 [ 0 ] . Id3 ) ;
247+ Assert . NotNull ( t1 [ 0 ] . Categories ) ;
248+ Assert . Null ( t1 [ 0 ] . Id ) ;
249+ Assert . True ( t1 . NumFound > 0 ) ;
250+ }
251+
252+ [ Fact ]
253+ public void SelectAnyAfterSelect ( )
254+ {
255+ IQueryable < DerivedProduct > derivedProducts = Product . SolrOperations . Value . AsQueryable ( )
256+ . Where ( p => p . Id != null )
257+ . Select ( p => new DerivedProduct { Id2 = p . Id , Categories = p . Categories } )
258+ . Where ( p => p . Id2 != null && p . Categories . Any ( ) ) ;
259+
260+ IQueryable < Product > q2 = derivedProducts . Cast < Product > ( ) ;
261+
262+ var t1 = q2 . ToSolrQueryResults ( ) ;
263+
264+ Assert . NotNull ( t1 ) ;
265+ Assert . NotNull ( t1 [ 0 ] . Categories ) ;
266+ Assert . Null ( t1 [ 0 ] . Id ) ;
153267 Assert . True ( t1 . NumFound > 0 ) ;
154268 }
155269
0 commit comments