@@ -457,41 +457,19 @@ public static IQueryable GroupJoin([NotNull] this IQueryable outer, [NotNull] IE
457
457
LambdaExpression outerSelectorLambda = DynamicExpressionParser . ParseLambda ( createParameterCtor , outerType , null , outerKeySelector , args ) ;
458
458
LambdaExpression innerSelectorLambda = DynamicExpressionParser . ParseLambda ( createParameterCtor , innerType , null , innerKeySelector , args ) ;
459
459
460
- Type outerSelectorReturnType = outerSelectorLambda . Body . Type ;
461
- Type innerSelectorReturnType = innerSelectorLambda . Body . Type ;
462
-
463
- // If types are not the same, try to convert to Nullable and generate new LambdaExpression
464
- if ( outerSelectorReturnType != innerSelectorReturnType )
465
- {
466
- if ( ExpressionParser . IsNullableType ( outerSelectorReturnType ) && ! ExpressionParser . IsNullableType ( innerSelectorReturnType ) )
467
- {
468
- innerSelectorReturnType = ExpressionParser . ToNullableType ( innerSelectorReturnType ) ;
469
- innerSelectorLambda = DynamicExpressionParser . ParseLambda ( createParameterCtor , innerType , innerSelectorReturnType , innerKeySelector , args ) ;
470
- }
471
- else if ( ! ExpressionParser . IsNullableType ( outerSelectorReturnType ) && ExpressionParser . IsNullableType ( innerSelectorReturnType ) )
472
- {
473
- outerSelectorReturnType = ExpressionParser . ToNullableType ( outerSelectorReturnType ) ;
474
- outerSelectorLambda = DynamicExpressionParser . ParseLambda ( createParameterCtor , outerType , outerSelectorReturnType , outerKeySelector , args ) ;
475
- }
476
-
477
- // If types are still not the same, throw an Exception
478
- if ( outerSelectorReturnType != innerSelectorReturnType )
479
- {
480
- throw new ParseException ( string . Format ( CultureInfo . CurrentCulture , Res . IncompatibleTypes , outerType , innerType ) , - 1 ) ;
481
- }
482
- }
460
+ CheckOuterAndInnerTypes ( createParameterCtor , outerType , innerType , outerKeySelector , innerKeySelector , ref outerSelectorLambda , ref innerSelectorLambda , args ) ;
483
461
484
462
ParameterExpression [ ] parameters =
485
463
{
486
464
Expression . Parameter ( outerType , "outer" ) ,
487
- Expression . Parameter ( typeof ( IEnumerable < > ) . MakeGenericType ( inner . AsQueryable ( ) . ElementType ) , "inner" )
465
+ Expression . Parameter ( typeof ( IEnumerable < > ) . MakeGenericType ( innerType ) , "inner" )
488
466
} ;
489
467
490
468
LambdaExpression resultSelectorLambda = DynamicExpressionParser . ParseLambda ( createParameterCtor , parameters , null , resultSelector , args ) ;
491
469
492
470
return outer . Provider . CreateQuery ( Expression . Call (
493
- typeof ( Queryable ) ,
494
- "GroupJoin" , new [ ] { outer . ElementType , innerType , outerSelectorLambda . Body . Type , resultSelectorLambda . Body . Type } ,
471
+ typeof ( Queryable ) , "GroupJoin" ,
472
+ new [ ] { outer . ElementType , innerType , outerSelectorLambda . Body . Type , resultSelectorLambda . Body . Type } ,
495
473
outer . Expression ,
496
474
Expression . Constant ( inner ) ,
497
475
Expression . Quote ( outerSelectorLambda ) ,
@@ -528,29 +506,7 @@ public static IQueryable Join([NotNull] this IQueryable outer, [NotNull] IEnumer
528
506
LambdaExpression outerSelectorLambda = DynamicExpressionParser . ParseLambda ( createParameterCtor , outerType , null , outerKeySelector , args ) ;
529
507
LambdaExpression innerSelectorLambda = DynamicExpressionParser . ParseLambda ( createParameterCtor , innerType , null , innerKeySelector , args ) ;
530
508
531
- Type outerSelectorReturnType = outerSelectorLambda . Body . Type ;
532
- Type innerSelectorReturnType = innerSelectorLambda . Body . Type ;
533
-
534
- // If types are not the same, try to convert to Nullable and generate new LambdaExpression
535
- if ( outerSelectorReturnType != innerSelectorReturnType )
536
- {
537
- if ( ExpressionParser . IsNullableType ( outerSelectorReturnType ) && ! ExpressionParser . IsNullableType ( innerSelectorReturnType ) )
538
- {
539
- innerSelectorReturnType = ExpressionParser . ToNullableType ( innerSelectorReturnType ) ;
540
- innerSelectorLambda = DynamicExpressionParser . ParseLambda ( createParameterCtor , innerType , innerSelectorReturnType , innerKeySelector , args ) ;
541
- }
542
- else if ( ! ExpressionParser . IsNullableType ( outerSelectorReturnType ) && ExpressionParser . IsNullableType ( innerSelectorReturnType ) )
543
- {
544
- outerSelectorReturnType = ExpressionParser . ToNullableType ( outerSelectorReturnType ) ;
545
- outerSelectorLambda = DynamicExpressionParser . ParseLambda ( createParameterCtor , outerType , outerSelectorReturnType , outerKeySelector , args ) ;
546
- }
547
-
548
- // If types are still not the same, throw an Exception
549
- if ( outerSelectorReturnType != innerSelectorReturnType )
550
- {
551
- throw new ParseException ( string . Format ( CultureInfo . CurrentCulture , Res . IncompatibleTypes , outerType , innerType ) , - 1 ) ;
552
- }
553
- }
509
+ CheckOuterAndInnerTypes ( createParameterCtor , outerType , innerType , outerKeySelector , innerKeySelector , ref outerSelectorLambda , ref innerSelectorLambda , args ) ;
554
510
555
511
ParameterExpression [ ] parameters =
556
512
{
@@ -1361,8 +1317,34 @@ public static IQueryable Where([NotNull] this IQueryable source, [NotNull] strin
1361
1317
#endregion
1362
1318
1363
1319
#region Private Helpers
1364
- // Code below is based on https://github.com/aspnet/EntityFramework/blob/9186d0b78a3176587eeb0f557c331f635760fe92/src/Microsoft.EntityFrameworkCore/EntityFrameworkQueryableExtensions.cs
1320
+ private static void CheckOuterAndInnerTypes ( bool createParameterCtor , Type outerType , Type innerType , string outerKeySelector , string innerKeySelector , ref LambdaExpression outerSelectorLambda , ref LambdaExpression innerSelectorLambda , params object [ ] args )
1321
+ {
1322
+ Type outerSelectorReturnType = outerSelectorLambda . Body . Type ;
1323
+ Type innerSelectorReturnType = innerSelectorLambda . Body . Type ;
1324
+
1325
+ // If types are not the same, try to convert to Nullable and generate new LambdaExpression
1326
+ if ( outerSelectorReturnType != innerSelectorReturnType )
1327
+ {
1328
+ if ( ExpressionParser . IsNullableType ( outerSelectorReturnType ) && ! ExpressionParser . IsNullableType ( innerSelectorReturnType ) )
1329
+ {
1330
+ innerSelectorReturnType = ExpressionParser . ToNullableType ( innerSelectorReturnType ) ;
1331
+ innerSelectorLambda = DynamicExpressionParser . ParseLambda ( createParameterCtor , innerType , innerSelectorReturnType , innerKeySelector , args ) ;
1332
+ }
1333
+ else if ( ! ExpressionParser . IsNullableType ( outerSelectorReturnType ) && ExpressionParser . IsNullableType ( innerSelectorReturnType ) )
1334
+ {
1335
+ outerSelectorReturnType = ExpressionParser . ToNullableType ( outerSelectorReturnType ) ;
1336
+ outerSelectorLambda = DynamicExpressionParser . ParseLambda ( createParameterCtor , outerType , outerSelectorReturnType , outerKeySelector , args ) ;
1337
+ }
1365
1338
1339
+ // If types are still not the same, throw an Exception
1340
+ if ( outerSelectorReturnType != innerSelectorReturnType )
1341
+ {
1342
+ throw new ParseException ( string . Format ( CultureInfo . CurrentCulture , Res . IncompatibleTypes , outerType , innerType ) , - 1 ) ;
1343
+ }
1344
+ }
1345
+ }
1346
+
1347
+ // Code below is based on https://github.com/aspnet/EntityFramework/blob/9186d0b78a3176587eeb0f557c331f635760fe92/src/Microsoft.EntityFrameworkCore/EntityFrameworkQueryableExtensions.cs
1366
1348
private static IQueryable CreateQuery ( MethodInfo operatorMethodInfo , IQueryable source )
1367
1349
{
1368
1350
if ( operatorMethodInfo . IsGenericMethod )
0 commit comments