@@ -1238,17 +1238,13 @@ protected virtual object VisitBinary(BinaryExpression b)
1238
1238
var operand = BindOperant ( b . NodeType ) ; //sep= " " ??
1239
1239
if ( operand == "AND" || operand == "OR" )
1240
1240
{
1241
- var m = b . Left as MemberExpression ;
1242
- if ( m != null && m . Expression != null
1243
- && m . Expression . NodeType == ExpressionType . Parameter )
1244
- left = new PartialSqlString ( string . Format ( "{0}={1}" , VisitMemberAccess ( m ) , GetQuotedTrueValue ( ) ) ) ;
1241
+ if ( IsParameterAccess ( b . Left ) )
1242
+ left = new PartialSqlString ( string . Format ( "{0}={1}" , VisitMemberAccess ( ( MemberExpression ) b . Left ) , GetQuotedTrueValue ( ) ) ) ;
1245
1243
else
1246
1244
left = Visit ( b . Left ) ;
1247
1245
1248
- m = b . Right as MemberExpression ;
1249
- if ( m != null && m . Expression != null
1250
- && m . Expression . NodeType == ExpressionType . Parameter )
1251
- right = new PartialSqlString ( string . Format ( "{0}={1}" , VisitMemberAccess ( m ) , GetQuotedTrueValue ( ) ) ) ;
1246
+ if ( IsParameterAccess ( b . Right ) )
1247
+ right = new PartialSqlString ( string . Format ( "{0}={1}" , VisitMemberAccess ( ( MemberExpression ) b . Right ) , GetQuotedTrueValue ( ) ) ) ;
1252
1248
else
1253
1249
right = Visit ( b . Right ) ;
1254
1250
@@ -1355,6 +1351,31 @@ protected virtual object VisitBinary(BinaryExpression b)
1355
1351
}
1356
1352
}
1357
1353
1354
+ /// <summary>
1355
+ /// Determines whether the expression is the parameter.
1356
+ /// </summary>
1357
+ /// <param name="e">The specified expression.</param>
1358
+ /// <returns>Returns true if the specified expression is parameter;
1359
+ /// otherwise, false.</returns>
1360
+ protected virtual bool IsParameterAccess ( Expression e )
1361
+ {
1362
+ while ( e != null )
1363
+ {
1364
+ if ( e . NodeType == ExpressionType . Parameter )
1365
+ {
1366
+ var isSubExprAccess = e is UnaryExpression &&
1367
+ ( ( UnaryExpression ) e ) . Operand is IndexExpression ;
1368
+
1369
+ if ( ! isSubExprAccess )
1370
+ return true ;
1371
+ }
1372
+
1373
+ e = ( e as MemberExpression ) ? . Expression ;
1374
+ }
1375
+
1376
+ return false ;
1377
+ }
1378
+
1358
1379
private static void Swap ( ref object left , ref object right )
1359
1380
{
1360
1381
var temp = right ;
@@ -1608,10 +1629,8 @@ private bool IsColumnAccess(MethodCallExpression m)
1608
1629
return IsColumnAccess ( m . Object as MethodCallExpression ) ;
1609
1630
1610
1631
var exp = m . Object as MemberExpression ;
1611
- return exp != null
1612
- && exp . Expression != null
1613
- && IsJoinedTable ( exp . Expression . Type )
1614
- && exp . Expression . NodeType == ExpressionType . Parameter ;
1632
+ return IsParameterAccess ( exp )
1633
+ && IsJoinedTable ( exp . Expression . Type ) ;
1615
1634
}
1616
1635
1617
1636
protected virtual object VisitMethodCall ( MethodCallExpression m )
0 commit comments