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

Commit f899103

Browse files
committed
C#-ify SqlExpression
1 parent b245e31 commit f899103

2 files changed

Lines changed: 31 additions & 34 deletions

File tree

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,7 @@ protected SqlExpression(IOrmLiteDialectProvider dialectProvider)
6868
tableDefs.Add(modelDef);
6969

7070
var initFilter = OrmLiteConfig.SqlExpressionInitFilter;
71-
if (initFilter != null)
72-
{
73-
initFilter(this.GetUntyped());
74-
}
71+
initFilter?.Invoke(this.GetUntyped());
7572
}
7673

7774
public SqlExpression<T> Clone()
@@ -1638,7 +1635,7 @@ public virtual object Visit(Expression exp)
16381635
}
16391636
}
16401637

1641-
protected internal virtual object VisitJoin(Expression exp)
1638+
protected virtual object VisitJoin(Expression exp)
16421639
{
16431640
skipParameterizationForThisExpression = true;
16441641
var visitedExpression = Visit(exp);
@@ -1670,10 +1667,10 @@ protected virtual object VisitLambda(LambdaExpression lambda)
16701667
}
16711668
else if (lambda.Body.NodeType == ExpressionType.Conditional && sep == " ")
16721669
{
1673-
ConditionalExpression c = lambda.Body as ConditionalExpression;
1670+
var c = lambda.Body as ConditionalExpression;
16741671

16751672
var r = VisitConditional(c);
1676-
if (!(r is PartialSqlString))
1673+
if (r is not PartialSqlString)
16771674
return r;
16781675

16791676
return $"{r}={GetQuotedTrueValue()}";
@@ -1695,17 +1692,17 @@ protected virtual object VisitBinary(BinaryExpression b)
16951692
{
16961693
object originalLeft = null, originalRight = null, left, right;
16971694
var operand = BindOperant(b.NodeType); //sep= " " ??
1698-
if (operand == "AND" || operand == "OR")
1695+
if (operand is "AND" or "OR")
16991696
{
17001697
if (IsBooleanComparison(b.Left))
17011698
{
17021699
left = VisitMemberAccess((MemberExpression) b.Left);
17031700
if (left is PartialSqlString)
17041701
left = new PartialSqlString($"{left}={GetQuotedTrueValue()}");
17051702
}
1706-
else if (b.Left is ConditionalExpression)
1703+
else if (b.Left is ConditionalExpression expr)
17071704
{
1708-
left = VisitConditional((ConditionalExpression) b.Left);
1705+
left = VisitConditional(expr);
17091706
if (left is PartialSqlString)
17101707
left = new PartialSqlString($"{left}={GetQuotedTrueValue()}");
17111708
}
@@ -1717,29 +1714,28 @@ protected virtual object VisitBinary(BinaryExpression b)
17171714
if (right is PartialSqlString)
17181715
right = new PartialSqlString($"{right}={GetQuotedTrueValue()}");
17191716
}
1720-
else if (b.Right is ConditionalExpression)
1717+
else if (b.Right is ConditionalExpression expr)
17211718
{
1722-
right = VisitConditional((ConditionalExpression) b.Right);
1719+
right = VisitConditional(expr);
17231720
if (right is PartialSqlString)
17241721
right = new PartialSqlString($"{right}={GetQuotedTrueValue()}");
17251722
}
17261723
else right = Visit(b.Right);
17271724

1728-
if (!(left is PartialSqlString) && !(right is PartialSqlString))
1725+
if (left is not PartialSqlString && right is not PartialSqlString)
17291726
{
17301727
var result = CachedExpressionCompiler.Evaluate(PreEvaluateBinary(b, left, right));
17311728
return result;
17321729
}
17331730

1734-
if (!(left is PartialSqlString))
1731+
if (left is not PartialSqlString)
17351732
left = ((bool)left) ? GetTrueExpression() : GetFalseExpression();
1736-
if (!(right is PartialSqlString))
1733+
if (right is not PartialSqlString)
17371734
right = ((bool)right) ? GetTrueExpression() : GetFalseExpression();
17381735
}
1739-
else if ((operand == "=" || operand == "<>") && b.Left is MethodCallExpression && ((MethodCallExpression)b.Left).Method.Name == "CompareString")
1736+
else if ((operand is "=" or "<>") && b.Left is MethodCallExpression methodExpr && methodExpr.Method.Name == "CompareString")
17401737
{
17411738
//Handle VB.NET converting (x => x.Name == "Foo") into (x => CompareString(x.Name, "Foo", False)
1742-
var methodExpr = (MethodCallExpression)b.Left;
17431739
var args = this.VisitExpressionList(methodExpr.Arguments);
17441740
right = GetValue(args[1], typeof(string));
17451741
ConvertToPlaceholderAndParameter(ref right);
@@ -1751,8 +1747,7 @@ protected virtual object VisitBinary(BinaryExpression b)
17511747
originalRight = right = Visit(b.Right);
17521748

17531749
// Handle "expr = true/false", including with the constant on the left
1754-
1755-
if (operand == "=" || operand == "<>")
1750+
if (operand is "=" or "<>")
17561751
{
17571752
if (left is bool)
17581753
{
@@ -1768,12 +1763,13 @@ protected virtual object VisitBinary(BinaryExpression b)
17681763
return true; // "null != true/false" becomes "true"
17691764
}
17701765

1771-
if (right is bool && !IsFieldName(left) && !(b.Left is ConditionalExpression)) // Don't change anything when "expr" is a column name or ConditionalExpression - then we really want "ColName = 1" or (Case When 1=0 Then 1 Else 0 End = 1)
1766+
// Don't change anything when "expr" is a column name or ConditionalExpression - then we really want "ColName = 1" or (Case When 1=0 Then 1 Else 0 End = 1)
1767+
if (right is bool rightBool && !IsFieldName(left) && b.Left is not ConditionalExpression)
17721768
{
17731769
if (operand == "=")
1774-
return (bool)right ? left : GetNotValue(left); // "expr == true" becomes "expr", "expr == false" becomes "not (expr)"
1770+
return rightBool ? left : GetNotValue(left); // "expr == true" becomes "expr", "expr == false" becomes "not (expr)"
17751771
if (operand == "<>")
1776-
return (bool)right ? GetNotValue(left) : left; // "expr != true" becomes "not (expr)", "expr != false" becomes "expr"
1772+
return rightBool ? GetNotValue(left) : left; // "expr != true" becomes "not (expr)", "expr != false" becomes "expr"
17771773
}
17781774
}
17791775

@@ -1793,23 +1789,22 @@ protected virtual object VisitBinary(BinaryExpression b)
17931789
}
17941790
else if (leftNeedsCoercing)
17951791
{
1796-
var leftPartialSql = left as PartialSqlString;
1797-
if (leftPartialSql == null)
1792+
if (left is not PartialSqlString)
17981793
{
17991794
left = DialectProvider.GetQuotedValue(left, rightEnum.EnumType);
18001795
}
18011796
}
1802-
else if (!(left is PartialSqlString) && !(right is PartialSqlString))
1797+
else if (left is not PartialSqlString && right is not PartialSqlString)
18031798
{
18041799
var evaluatedValue = CachedExpressionCompiler.Evaluate(PreEvaluateBinary(b, left, right));
18051800
var result = VisitConstant(Expression.Constant(evaluatedValue));
18061801
return result;
18071802
}
1808-
else if (!(left is PartialSqlString))
1803+
else if (left is not PartialSqlString)
18091804
{
18101805
left = DialectProvider.GetQuotedValue(left, left?.GetType());
18111806
}
1812-
else if (!(right is PartialSqlString))
1807+
else if (right is not PartialSqlString)
18131808
{
18141809
right = GetValue(right, right?.GetType());
18151810
}
@@ -1870,9 +1865,8 @@ private BinaryExpression PreEvaluateBinary(BinaryExpression b, object left, obje
18701865
/// otherwise, false.</returns>
18711866
protected virtual bool IsBooleanComparison(Expression e)
18721867
{
1873-
if (!(e is MemberExpression)) return false;
1874-
1875-
var m = (MemberExpression)e;
1868+
if (e is not MemberExpression m)
1869+
return false;
18761870

18771871
if (m.Member.DeclaringType.IsNullableType() &&
18781872
m.Member.Name == "HasValue") //nameof(Nullable<bool>.HasValue)

tests/ServiceStack.OrmLite.Tests/Expression/SqlExpressionTests.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ public class LetterFrequency
1717
public int Id { get; set; }
1818

1919
public string Letter { get; set; }
20+
21+
[Alias("AliasValue")]
22+
public int Value { get; set; }
2023
}
2124

2225
public class LetterWeighting
@@ -39,13 +42,13 @@ public class SqlExpressionTests : ExpressionsTestBase
3942
{
4043
public SqlExpressionTests(DialectContext context) : base(context) {}
4144

42-
private int letterFrequenceMaxId;
45+
private int letterFrequencyMaxId;
4346
private int letterFrequencyMinId;
4447
private int letterFrequencySumId;
4548

4649
private void GetIdStats(IDbConnection db)
4750
{
48-
letterFrequenceMaxId = db.Scalar<int>(db.From<LetterFrequency>().Select(Sql.Max("Id")));
51+
letterFrequencyMaxId = db.Scalar<int>(db.From<LetterFrequency>().Select(Sql.Max("Id")));
4952
letterFrequencyMinId = db.Scalar<int>(db.From<LetterFrequency>().Select(Sql.Min("Id")));
5053
letterFrequencySumId = db.Scalar<int>(db.From<LetterFrequency>().Select(Sql.Sum("Id")));
5154
}
@@ -251,7 +254,7 @@ public async System.Threading.Tasks.Task Can_Select_as_List_ValueTuple_Async()
251254
private void CheckDbTypeInsensitiveEquivalency(List<object> result)
252255
{
253256
Assert.That(Convert.ToInt64(result[0]), Is.EqualTo(10));
254-
Assert.That(Convert.ToInt64(result[1]), Is.EqualTo(letterFrequenceMaxId));
257+
Assert.That(Convert.ToInt64(result[1]), Is.EqualTo(letterFrequencyMaxId));
255258
Assert.That(Convert.ToInt64(result[2]), Is.EqualTo(letterFrequencyMinId));
256259
Assert.That(Convert.ToInt64(result[3]), Is.EqualTo(letterFrequencySumId));
257260
}
@@ -286,7 +289,7 @@ public void Can_Select_as_Dictionary_Object()
286289
private void CheckDbTypeInsensitiveEquivalency(Dictionary<string, object> result)
287290
{
288291
Assert.That(Convert.ToInt64(result["Count"]), Is.EqualTo(10));
289-
Assert.That(Convert.ToInt64(result["Max"]), Is.EqualTo(letterFrequenceMaxId));
292+
Assert.That(Convert.ToInt64(result["Max"]), Is.EqualTo(letterFrequencyMaxId));
290293
Assert.That(Convert.ToInt64(result["Min"]), Is.EqualTo(letterFrequencyMinId));
291294
Assert.That(Convert.ToInt64(result["Sum"]), Is.EqualTo(letterFrequencySumId));
292295
}

0 commit comments

Comments
 (0)