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

Commit f1e9fbf

Browse files
committed
Merge branch 'master' of github.com:ServiceStack/ServiceStack.OrmLite
2 parents ba544c4 + 98e33db commit f1e9fbf

File tree

2 files changed

+222
-2
lines changed

2 files changed

+222
-2
lines changed

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1906,14 +1906,42 @@ protected virtual object VisitConditional(ConditionalExpression e)
19061906
{
19071907
var ifTrue = Visit(e.IfTrue);
19081908
if (!IsSqlClass(ifTrue))
1909-
ifTrue = ConvertToParam(ifTrue);
1909+
{
1910+
if (sep == " ")
1911+
ifTrue = new PartialSqlString(ConvertToParam(ifTrue));
1912+
}
1913+
else if (e.IfTrue.Type == typeof(bool))
1914+
{
1915+
var isBooleanComparison = IsBooleanComparison(e.IfTrue);
1916+
if (!isBooleanComparison)
1917+
{
1918+
if (sep == " ")
1919+
ifTrue = ifTrue.ToString();
1920+
else
1921+
ifTrue = new PartialSqlString($"(CASE WHEN {ifTrue} THEN {1} ELSE {0} END)");
1922+
}
1923+
}
19101924

19111925
return ifTrue;
19121926
}
19131927

19141928
var ifFalse = Visit(e.IfFalse);
19151929
if (!IsSqlClass(ifFalse))
1916-
ifFalse = ConvertToParam(ifFalse);
1930+
{
1931+
if (sep == " ")
1932+
ifFalse = new PartialSqlString(ConvertToParam(ifFalse));
1933+
}
1934+
else if (e.IfFalse.Type == typeof(bool))
1935+
{
1936+
var isBooleanComparison = IsBooleanComparison(e.IfFalse);
1937+
if (!isBooleanComparison)
1938+
{
1939+
if (sep == " ")
1940+
ifFalse = ifFalse.ToString();
1941+
else
1942+
ifFalse = new PartialSqlString($"(CASE WHEN {ifFalse} THEN {1} ELSE {0} END)");
1943+
}
1944+
}
19171945

19181946
return ifFalse;
19191947
}

tests/ServiceStack.OrmLite.Tests/ExpressionVisitorTests.cs

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,198 @@ public void Can_Where_using_And_Equal_Conditional_filter()
669669
Assert.That(target.Count, Is.EqualTo(2));
670670
}
671671

672+
[Test]
673+
public void Can_Where_using_Constant_in_Conditional_filter1()
674+
{
675+
var i = 0;
676+
System.Linq.Expressions.Expression<Func<TestType, bool>> filter = x => i > 0 ? x.BoolCol : x.TextCol.Contains("qwer");
677+
var q = Db.From<TestType>().Where(filter);
678+
Assert.That(q.ToSelectStatement().ToLower(), Does.Not.Contain("="));
679+
680+
var target = Db.Select(q);
681+
Assert.That(target.Count, Is.EqualTo(2));
682+
}
683+
684+
[Test]
685+
public void Can_Where_using_Constant_in_Conditional_filter2()
686+
{
687+
var i = 10;
688+
System.Linq.Expressions.Expression<Func<TestType, bool>> filter = x => i > 0 ? x.BoolCol : x.TextCol.Contains("qwer");
689+
var q = Db.From<TestType>().Where(filter);
690+
Assert.That(q.ToSelectStatement().ToLower(), Does.Contain("="));
691+
692+
var target = Db.Select(q);
693+
Assert.That(target.Count, Is.EqualTo(2));
694+
}
695+
696+
[Test]
697+
public void Can_Where_using_Constant_in_Conditional_filter3()
698+
{
699+
var i = 0;
700+
var fake = 1;
701+
System.Linq.Expressions.Expression<Func<TestType, bool>> filter = x => x.Id > 0 ? fake != fake : x.TextCol.Contains("zxcv");
702+
var q = Db.From<TestType>().Where(filter);
703+
Assert.That(q.ToSelectStatement().ToLower(), Does.Contain("="));
704+
705+
var target = Db.Select(q);
706+
Assert.That(target.Count, Is.EqualTo(0));
707+
}
708+
709+
[Test]
710+
public void Can_Where_using_Constant_in_Conditional_filter4()
711+
{
712+
var i = 10;
713+
var fake = 1;
714+
System.Linq.Expressions.Expression<Func<TestType, bool>> filter = x => i > 0 ? fake != fake : x.TextCol.Contains("qwer");
715+
var q = Db.From<TestType>().Where(filter);
716+
Assert.That(q.ToSelectStatement().ToLower(), Does.Contain("="));
717+
718+
var target = Db.Select(q);
719+
Assert.That(target.Count, Is.EqualTo(0));
720+
}
721+
722+
723+
[Test]
724+
public void Can_Where_using_Constant_in_Conditional_filter5()
725+
{
726+
var i = 10;
727+
var fake = 1;
728+
System.Linq.Expressions.Expression<Func<TestType, bool>> filter = x => i > 0 ? x.Id == x.Id : x.TextCol.Contains("qwer");
729+
var q = Db.From<TestType>().Where(filter);
730+
Assert.That(q.ToSelectStatement().ToLower(), Does.Contain("="));
731+
Assert.That(q.ToSelectStatement().ToLower(), Does.Not.Contain("=1"));
732+
733+
var target = Db.Select(q);
734+
Assert.That(target.Count, Is.EqualTo(4));
735+
}
736+
737+
[Test]
738+
public void Can_Where_using_Conditional_order1()
739+
{
740+
var i = 0;
741+
var fake = 1;
742+
System.Linq.Expressions.Expression<Func<TestType, object>> order = x => x.Id > 2 ? x.BoolCol : x.TextCol.Contains("qwer");
743+
var q = Db.From<TestType>().OrderBy(order).ThenBy(x => x.Id);
744+
Assert.That(q.ToSelectStatement().ToLower(), Does.Not.Contain("="));
745+
746+
var target = Db.Select(q);
747+
Assert.That(target.Count, Is.EqualTo(4));
748+
var text = target[0].TextCol;
749+
Assert.AreEqual("asdf", text);
750+
}
751+
752+
[Test]
753+
public void Can_Where_using_Constant_in_Conditional_order1()
754+
{
755+
var i = 0;
756+
var fake = 1;
757+
System.Linq.Expressions.Expression<Func<TestType, object>> order = x => i > 0 ? x.BoolCol : x.TextCol.Contains("qwer");
758+
var q = Db.From<TestType>().OrderBy(order).ThenBy(x => x.Id);
759+
Assert.That(q.ToSelectStatement().ToLower(), Does.Not.Contain("="));
760+
Assert.That(q.ToSelectStatement().ToLower(), Does.Contain(" like "));
761+
Assert.That(q.ToSelectStatement().ToLower(), Does.Contain("case when "));
762+
763+
var target = Db.Select(q);
764+
Assert.That(target.Count, Is.EqualTo(4));
765+
var text = target[0].TextCol;
766+
Assert.AreEqual("asdf", text);
767+
}
768+
769+
[Test]
770+
public void Can_Where_using_Constant_in_Conditional_order2()
771+
{
772+
var i = 10;
773+
var fake = 1;
774+
System.Linq.Expressions.Expression<Func<TestType, object>> order = x => i > 0 ? x.BoolCol : x.TextCol.Contains("qwer");
775+
var q = Db.From<TestType>().OrderBy(order).ThenBy(x => x.Id);
776+
Assert.That(q.ToSelectStatement().ToLower(), Does.Not.Contain("="));
777+
Assert.That(q.ToSelectStatement().ToLower(), Does.Contain("order by \"boolcol\""));
778+
779+
var target = Db.Select(q);
780+
Assert.That(target.Count, Is.EqualTo(4));
781+
var text = target[0].TextCol;
782+
Assert.AreEqual("qwer", text);
783+
}
784+
785+
[Test]
786+
public void Can_Where_using_Constant_in_Conditional_order3()
787+
{
788+
var i = 0;
789+
var fake = 1;
790+
System.Linq.Expressions.Expression<Func<TestType, object>> order = x => i > 0 ? false : x.TextCol.Contains("qwer");
791+
var q = Db.From<TestType>().OrderBy(order).ThenBy(x => x.Id);
792+
Assert.That(q.ToSelectStatement().ToLower(), Does.Not.Contain("="));
793+
Assert.That(q.ToSelectStatement().ToLower(), Does.Contain("@0"));
794+
Assert.That(q.ToSelectStatement().ToLower(), Does.Contain("case when "));
795+
796+
var target = Db.Select(q);
797+
Assert.That(target.Count, Is.EqualTo(4));
798+
var text = target[0].TextCol;
799+
Assert.AreEqual("asdf", text);
800+
}
801+
802+
[Test]
803+
public void Can_Where_using_Constant_in_Conditional_order4()
804+
{
805+
var i = 10;
806+
var fake = 1;
807+
System.Linq.Expressions.Expression<Func<TestType, object>> order = x => i > 0 ? false : x.TextCol.Contains("qwer");
808+
var q = Db.From<TestType>().OrderBy(order).ThenBy(x => x.Id);
809+
Assert.That(q.ToSelectStatement().ToLower(), Does.Not.Contain("="));
810+
Assert.That(q.ToSelectStatement().ToLower(), Does.Not.Contain("@0"));
811+
812+
var target = Db.Select(q);
813+
Assert.That(target.Count, Is.EqualTo(4));
814+
var text = target[0].TextCol;
815+
Assert.AreEqual("asdf", text);
816+
}
817+
818+
[Test]
819+
public void Can_Where_using_Constant_in_Conditional_order5()
820+
{
821+
var i = 0;
822+
System.Linq.Expressions.Expression<Func<TestType, object>> order = x => i > 0 ? x.TextCol : "www";
823+
var q = Db.From<TestType>().OrderBy(order).ThenBy(x => x.Id);
824+
Assert.That(q.ToSelectStatement().ToLower(), Does.Not.Contain("="));
825+
Assert.That(q.ToSelectStatement().ToLower(), Does.Not.Contain("@0"));
826+
Assert.That(q.ToSelectStatement().ToLower(), Does.Contain("order by \"id\""));
827+
828+
var target = Db.Select(q);
829+
Assert.That(target.Count, Is.EqualTo(4));
830+
var text = target[0].TextCol;
831+
Assert.AreEqual("asdf", text);
832+
}
833+
834+
[Test]
835+
public void Can_Where_using_Constant_in_Conditional_order6()
836+
{
837+
var i = 10;
838+
System.Linq.Expressions.Expression<Func<TestType, object>> order = x => i > 0 ? x.TextCol : "www";
839+
var q = Db.From<TestType>().OrderBy(order).ThenBy(x => x.Id);
840+
Assert.That(q.ToSelectStatement().ToLower(), Does.Not.Contain("="));
841+
Assert.That(q.ToSelectStatement().ToLower(), Does.Not.Contain("@0"));
842+
843+
var target = Db.Select(q);
844+
Assert.That(target.Count, Is.EqualTo(4));
845+
var text = target[0].TextCol;
846+
Assert.AreEqual("asdf", text);
847+
}
848+
849+
[Test]
850+
public void Can_Where_using_Constant_in_Conditional_order7()
851+
{
852+
var i = 10;
853+
System.Linq.Expressions.Expression<Func<TestType, object>> order = x => x.Id > 0 ? x.TextCol : "www";
854+
var q = Db.From<TestType>().OrderBy(order).ThenBy(x => x.Id);
855+
Assert.That(q.ToSelectStatement().ToLower(), Does.Not.Contain("="));
856+
Assert.That(q.ToSelectStatement().ToLower(), Does.Contain("@0"));
857+
858+
var target = Db.Select(q);
859+
Assert.That(target.Count, Is.EqualTo(4));
860+
var text = target[0].TextCol;
861+
Assert.AreEqual("asdf", text);
862+
}
863+
672864
private int MethodReturningInt(int val)
673865
{
674866
return val;

0 commit comments

Comments
 (0)