@@ -327,103 +327,117 @@ protected override Expression VisitMethodCall(MethodCallExpression mc)
327327 {
328328 using ( state . CreateScope ( ) ) {
329329 state . IsTailMethod = mc == context . Query && mc . IsQuery ( ) ;
330- var customCompiler = context . CustomCompilerProvider . GetCompiler ( mc . Method ) ;
331- if ( customCompiler != null )
330+ var method = mc . Method ;
331+ var customCompiler = context . CustomCompilerProvider . GetCompiler ( method ) ;
332+ if ( customCompiler != null ) {
332333 return Visit ( customCompiler . Invoke ( mc . Object , mc . Arguments . ToArray ( ) ) ) ;
334+ }
333335
334336 // Visit Query. Deprecated.
335337#pragma warning disable 612 , 618
336- if ( mc . Method . DeclaringType == typeof ( Query ) ) {
338+ if ( method . DeclaringType == typeof ( Query ) ) {
337339 // Query.All<T>
338- if ( mc . Method . IsGenericMethod && mc . Method . GetGenericMethodDefinition ( ) == WellKnownMembers . Query . All )
340+ if ( method . IsGenericMethodSpecificationOf ( WellKnownMembers . Query . All ) ) {
339341 return ConstructQueryable ( mc ) ;
342+ }
343+
340344 // Query.FreeText<T>
341- if ( mc . Method . IsGenericMethod && mc . Method . GetGenericMethodDefinition ( )
342- . In ( WellKnownMembers . Query . FreeTextString ,
343- WellKnownMembers . Query . FreeTextExpression ,
344- WellKnownMembers . Query . FreeTextExpressionTopNByRank ,
345- WellKnownMembers . Query . FreeTextStringTopNByRank ) )
346- return ConstructFreeTextQueryRoot ( mc . Method . GetGenericArguments ( ) [ 0 ] , mc . Arguments ) ;
345+ if ( method . IsGenericMethodSpecificationOf ( WellKnownMembers . Query . FreeTextString )
346+ || method . IsGenericMethodSpecificationOf ( WellKnownMembers . Query . FreeTextExpression )
347+ || method . IsGenericMethodSpecificationOf ( WellKnownMembers . Query . FreeTextExpressionTopNByRank )
348+ || method . IsGenericMethodSpecificationOf ( WellKnownMembers . Query . FreeTextStringTopNByRank ) ) {
349+ return ConstructFreeTextQueryRoot ( method . GetGenericArguments ( ) [ 0 ] , mc . Arguments ) ;
350+ }
351+
347352 // Query.ContainsTable<T>
348- if ( mc . Method . IsGenericMethod && mc . Method . GetGenericMethodDefinition ( )
349- . In ( WellKnownMembers . Query . ContainsTableExpr ,
350- WellKnownMembers . Query . ContainsTableExprWithColumns ,
351- WellKnownMembers . Query . ContainsTableExprTopNByRank ,
352- WellKnownMembers . Query . ContainsTableExprWithColumnsTopNByRank ) )
353- return ConstructContainsTableQueryRoot ( mc . Method . GetGenericArguments ( ) [ 0 ] , mc . Arguments ) ;
353+ if ( method . IsGenericMethodSpecificationOf ( WellKnownMembers . Query . ContainsTableExpr )
354+ || method . IsGenericMethodSpecificationOf ( WellKnownMembers . Query . ContainsTableExprWithColumns )
355+ || method . IsGenericMethodSpecificationOf ( WellKnownMembers . Query . ContainsTableExprTopNByRank )
356+ || method . IsGenericMethodSpecificationOf ( WellKnownMembers . Query . ContainsTableExprWithColumnsTopNByRank ) ) {
357+ return ConstructContainsTableQueryRoot ( method . GetGenericArguments ( ) [ 0 ] , mc . Arguments ) ;
358+ }
359+
354360 // Query.Single<T> & Query.SingleOrDefault<T>
355- if ( mc . Method . IsGenericMethod && mc . Method . GetGenericMethodDefinition ( ) . In (
356- WellKnownMembers . Query . SingleKey ,
357- WellKnownMembers . Query . SingleOrDefaultKey ) )
361+ if ( method . IsGenericMethodSpecificationOf ( WellKnownMembers . Query . SingleKey )
362+ || method . IsGenericMethodSpecificationOf ( WellKnownMembers . Query . SingleOrDefaultKey ) ) {
358363 return VisitQuerySingle ( mc ) ;
364+ }
365+
359366 throw new InvalidOperationException ( String . Format ( Strings . ExMethodCallExpressionXIsNotSupported , mc . ToString ( true ) ) ) ;
360367 }
361368 // Visit QueryEndpoint.
362- if ( mc . Method . DeclaringType == typeof ( QueryEndpoint ) ) {
369+ if ( method . DeclaringType == typeof ( QueryEndpoint ) ) {
363370 // Query.All<T>
364- if ( mc . Method . IsGenericMethod && mc . Method . GetGenericMethodDefinition ( ) == WellKnownMembers . QueryEndpoint . All )
371+ if ( method . IsGenericMethodSpecificationOf ( WellKnownMembers . QueryEndpoint . All ) ) {
365372 return ConstructQueryable ( mc ) ;
373+ }
374+
366375 // Query.FreeText<T>
367- if ( mc . Method . IsGenericMethod && mc . Method . GetGenericMethodDefinition ( )
368- . In ( WellKnownMembers . QueryEndpoint . FreeTextString ,
369- WellKnownMembers . QueryEndpoint . FreeTextExpression ,
370- WellKnownMembers . Query . FreeTextExpressionTopNByRank ,
371- WellKnownMembers . Query . FreeTextStringTopNByRank ) )
372- return ConstructFreeTextQueryRoot ( mc . Method . GetGenericArguments ( ) [ 0 ] , mc . Arguments ) ;
376+ if ( method . IsGenericMethodSpecificationOf ( WellKnownMembers . QueryEndpoint . FreeTextString )
377+ || method . IsGenericMethodSpecificationOf ( WellKnownMembers . QueryEndpoint . FreeTextExpression )
378+ || method . IsGenericMethodSpecificationOf ( WellKnownMembers . QueryEndpoint . FreeTextExpressionTopNByRank )
379+ || method . IsGenericMethodSpecificationOf ( WellKnownMembers . QueryEndpoint . FreeTextStringTopNByRank ) ) {
380+ return ConstructFreeTextQueryRoot ( method . GetGenericArguments ( ) [ 0 ] , mc . Arguments ) ;
381+ }
382+
373383 // Query.ContainsTable<T>
374- if ( mc . Method . IsGenericMethod && mc . Method . GetGenericMethodDefinition ( )
375- . In ( WellKnownMembers . QueryEndpoint . ContainsTableExpr ,
376- WellKnownMembers . QueryEndpoint . ContainsTableExprWithColumns ,
377- WellKnownMembers . QueryEndpoint . ContainsTableExprTopNByRank ,
378- WellKnownMembers . QueryEndpoint . ContainsTableExprWithColumnsTopNByRank ) )
379- return ConstructContainsTableQueryRoot ( mc . Method . GetGenericArguments ( ) [ 0 ] , mc . Arguments ) ;
384+ if ( method . IsGenericMethodSpecificationOf ( WellKnownMembers . QueryEndpoint . ContainsTableExpr )
385+ || method . IsGenericMethodSpecificationOf ( WellKnownMembers . QueryEndpoint . ContainsTableExprWithColumns )
386+ || method . IsGenericMethodSpecificationOf ( WellKnownMembers . QueryEndpoint . ContainsTableExprTopNByRank )
387+ || method . IsGenericMethodSpecificationOf ( WellKnownMembers . QueryEndpoint . ContainsTableExprWithColumnsTopNByRank ) ) {
388+ return ConstructContainsTableQueryRoot ( method . GetGenericArguments ( ) [ 0 ] , mc . Arguments ) ;
389+ }
390+
380391 // Query.Single<T> & Query.SingleOrDefault<T>
381- if ( mc . Method . IsGenericMethod && mc . Method . GetGenericMethodDefinition ( ) . In (
382- WellKnownMembers . QueryEndpoint . SingleKey ,
383- WellKnownMembers . QueryEndpoint . SingleOrDefaultKey ) )
392+ if ( method . IsGenericMethodSpecificationOf ( WellKnownMembers . QueryEndpoint . SingleKey )
393+ || method . IsGenericMethodSpecificationOf ( WellKnownMembers . QueryEndpoint . SingleOrDefaultKey ) ) {
384394 return VisitQuerySingle ( mc ) ;
385- if ( mc . Method . IsGenericMethod && mc . Method . GetGenericMethodDefinition ( ) == WellKnownMembers . QueryEndpoint . Items )
395+ }
396+
397+ if ( method . IsGenericMethodSpecificationOf ( WellKnownMembers . QueryEndpoint . Items ) ) {
386398 return VisitSequence ( mc . Arguments [ 0 ] . StripQuotes ( ) . Body , mc ) ;
399+ }
400+
387401 throw new InvalidOperationException ( String . Format ( Strings . ExMethodCallExpressionXIsNotSupported , mc . ToString ( true ) ) ) ;
388402 }
389403#pragma warning restore 612 , 618
390404
391405 // Visit Queryable extensions.
392- if ( mc . Method . DeclaringType == typeof ( QueryableExtensions ) )
393- if ( mc . Method . Name == WellKnownMembers . Queryable . ExtensionLeftJoin . Name )
406+ if ( method . DeclaringType == typeof ( QueryableExtensions ) )
407+ if ( method . Name == WellKnownMembers . Queryable . ExtensionLeftJoin . Name )
394408 return VisitLeftJoin ( mc ) ;
395- else if ( mc . Method . Name == "In" )
409+ else if ( method . Name == "In" )
396410 return VisitIn ( mc ) ;
397- else if ( mc . Method . Name == WellKnownMembers . Queryable . ExtensionLock . Name )
411+ else if ( method . Name == WellKnownMembers . Queryable . ExtensionLock . Name )
398412 return VisitLock ( mc ) ;
399- else if ( mc . Method . Name == WellKnownMembers . Queryable . ExtensionTake . Name )
413+ else if ( method . Name == WellKnownMembers . Queryable . ExtensionTake . Name )
400414 return VisitTake ( mc . Arguments [ 0 ] , mc . Arguments [ 1 ] ) ;
401- else if ( mc . Method . Name == WellKnownMembers . Queryable . ExtensionSkip . Name )
415+ else if ( method . Name == WellKnownMembers . Queryable . ExtensionSkip . Name )
402416 return VisitSkip ( mc . Arguments [ 0 ] , mc . Arguments [ 1 ] ) ;
403- else if ( mc . Method . Name == WellKnownMembers . Queryable . ExtensionElementAt . Name )
404- return VisitElementAt ( mc . Arguments [ 0 ] , mc . Arguments [ 1 ] , context . IsRoot ( mc ) , mc . Method . ReturnType , false ) ;
405- else if ( mc . Method . Name == WellKnownMembers . Queryable . ExtensionElementAtOrDefault . Name )
406- return VisitElementAt ( mc . Arguments [ 0 ] , mc . Arguments [ 1 ] , context . IsRoot ( mc ) , mc . Method . ReturnType , true ) ;
407- else if ( mc . Method . Name == WellKnownMembers . Queryable . ExtensionCount . Name )
408- return VisitAggregate ( mc . Arguments [ 0 ] , mc . Method , null , context . IsRoot ( mc ) , mc ) ;
417+ else if ( method . Name == WellKnownMembers . Queryable . ExtensionElementAt . Name )
418+ return VisitElementAt ( mc . Arguments [ 0 ] , mc . Arguments [ 1 ] , context . IsRoot ( mc ) , method . ReturnType , false ) ;
419+ else if ( method . Name == WellKnownMembers . Queryable . ExtensionElementAtOrDefault . Name )
420+ return VisitElementAt ( mc . Arguments [ 0 ] , mc . Arguments [ 1 ] , context . IsRoot ( mc ) , method . ReturnType , true ) ;
421+ else if ( method . Name == WellKnownMembers . Queryable . ExtensionCount . Name )
422+ return VisitAggregate ( mc . Arguments [ 0 ] , method , null , context . IsRoot ( mc ) , mc ) ;
409423 else
410424 throw new InvalidOperationException ( String . Format ( Strings . ExMethodCallExpressionXIsNotSupported , mc . ToString ( true ) ) ) ;
411425 // Visit Collection extensions
412- if ( mc . Method . DeclaringType == typeof ( CollectionExtensions ) )
413- if ( mc . Method . Name == WellKnownMembers . Collection . ExtensionContainsAny . Name )
414- return VisitContainsAny ( mc . Arguments [ 0 ] , mc . Arguments [ 1 ] , context . IsRoot ( mc ) , mc . Method . GetGenericArguments ( ) [ 0 ] ) ;
415- else if ( mc . Method . Name == WellKnownMembers . Collection . ExtensionContainsAll . Name )
416- return VisitContainsAll ( mc . Arguments [ 0 ] , mc . Arguments [ 1 ] , context . IsRoot ( mc ) , mc . Method . GetGenericArguments ( ) [ 0 ] ) ;
417- else if ( mc . Method . Name == WellKnownMembers . Collection . ExtensionContainsNone . Name )
418- return VisitContainsNone ( mc . Arguments [ 0 ] , mc . Arguments [ 1 ] , context . IsRoot ( mc ) , mc . Method . GetGenericArguments ( ) [ 0 ] ) ;
426+ if ( method . DeclaringType == typeof ( CollectionExtensions ) )
427+ if ( method . Name == WellKnownMembers . Collection . ExtensionContainsAny . Name )
428+ return VisitContainsAny ( mc . Arguments [ 0 ] , mc . Arguments [ 1 ] , context . IsRoot ( mc ) , method . GetGenericArguments ( ) [ 0 ] ) ;
429+ else if ( method . Name == WellKnownMembers . Collection . ExtensionContainsAll . Name )
430+ return VisitContainsAll ( mc . Arguments [ 0 ] , mc . Arguments [ 1 ] , context . IsRoot ( mc ) , method . GetGenericArguments ( ) [ 0 ] ) ;
431+ else if ( method . Name == WellKnownMembers . Collection . ExtensionContainsNone . Name )
432+ return VisitContainsNone ( mc . Arguments [ 0 ] , mc . Arguments [ 1 ] , context . IsRoot ( mc ) , method . GetGenericArguments ( ) [ 0 ] ) ;
419433
420434 // Process local collections
421435 if ( mc . Object . IsLocalCollection ( context ) ) {
422436 // IList.Contains
423- // List.Contains
437+ // List.Contains
424438 // Array.Contains
425- ParameterInfo [ ] parameters = mc . Method . GetParameters ( ) ;
426- if ( mc . Method . Name == "Contains" && parameters . Length == 1 )
439+ ParameterInfo [ ] parameters = method . GetParameters ( ) ;
440+ if ( method . Name == "Contains" && parameters . Length == 1 )
427441 return VisitContains ( mc . Object , mc . Arguments [ 0 ] , false ) ;
428442 }
429443
0 commit comments