Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 29ced0d

Browse files
author
o.nadymov
committed
Extracted method for checking Expression for the parameter.
1 parent ffe988c commit 29ced0d

File tree

1 file changed

+31
-12
lines changed

1 file changed

+31
-12
lines changed

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,17 +1238,13 @@ protected virtual object VisitBinary(BinaryExpression b)
12381238
var operand = BindOperant(b.NodeType); //sep= " " ??
12391239
if (operand == "AND" || operand == "OR")
12401240
{
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()));
12451243
else
12461244
left = Visit(b.Left);
12471245

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()));
12521248
else
12531249
right = Visit(b.Right);
12541250

@@ -1355,6 +1351,31 @@ protected virtual object VisitBinary(BinaryExpression b)
13551351
}
13561352
}
13571353

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+
13581379
private static void Swap(ref object left, ref object right)
13591380
{
13601381
var temp = right;
@@ -1608,10 +1629,8 @@ private bool IsColumnAccess(MethodCallExpression m)
16081629
return IsColumnAccess(m.Object as MethodCallExpression);
16091630

16101631
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);
16151634
}
16161635

16171636
protected virtual object VisitMethodCall(MethodCallExpression m)

0 commit comments

Comments
 (0)