Skip to content

Commit 9522c2e

Browse files
committed
Translate 'case when X is null...' to 'coalesce(X,...)'
1 parent 172e589 commit 9522c2e

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

src/EntityFramework6.Npgsql/SqlGenerators/SqlBaseGenerator.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -829,6 +829,23 @@ protected string GetDbType(EdmType edmType)
829829

830830
public override VisitedExpression Visit([NotNull] DbCaseExpression expression)
831831
{
832+
// Check for COALESCE like CASE
833+
if (expression.When.Count == 1 &&
834+
expression.When[0].ExpressionKind == DbExpressionKind.IsNull)
835+
{
836+
var isNullExpression = expression.When[0] as DbIsNullExpression;
837+
if (isNullExpression.Argument.Equals(expression.Else))
838+
{
839+
LiteralExpression coalesceExpression = new LiteralExpression(" COALESCE( ");
840+
coalesceExpression.Append(expression.Else.Accept(this));
841+
coalesceExpression.Append(",");
842+
coalesceExpression.Append(expression.Then[0].Accept(this));
843+
coalesceExpression.Append(") ");
844+
return coalesceExpression;
845+
}
846+
}
847+
848+
// General CASE
832849
var caseExpression = new LiteralExpression(" CASE ");
833850
for (var i = 0; i < expression.When.Count && i < expression.Then.Count; ++i)
834851
{

test/EntityFramework6.Npgsql.Tests/EntityFrameworkBasicTests.cs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -772,5 +772,67 @@ public void TestTableValuedStoredFunctions()
772772
Assert.AreEqual(1, list2[0].Something);
773773
}
774774
}
775+
776+
[Test]
777+
public void Test_issue_60_and_62()
778+
{
779+
using (var context = new BloggingContext(ConnectionString))
780+
{
781+
context.Database.Log = Console.Out.WriteLine;
782+
783+
context.Blogs.Add( new Blog { Name = "Hello" });
784+
context.SaveChanges();
785+
786+
string stringValue = "string_value";
787+
var query = context.Blogs.Select(b => stringValue + "_postfix");
788+
var blogTitle = query.First();
789+
Assert.That(blogTitle, Is.EqualTo("string_value_postfix"));
790+
Console.WriteLine(query.ToString());
791+
StringAssert.AreEqualIgnoringCase("SELECT COALESCE( @p__linq__0,E'') || E'_postfix' AS \"C1\" FROM \"dbo\".\"Blogs\" AS \"Extent1\"", query.ToString());
792+
}
793+
}
794+
795+
[Test]
796+
public void TestNullPropagation_1()
797+
{
798+
using (var context = new BloggingContext(ConnectionString))
799+
{
800+
context.Database.Log = Console.Out.WriteLine;
801+
802+
context.Blogs.Add( new Blog { Name = "Hello" });
803+
context.SaveChanges();
804+
805+
string stringValue = "string_value";
806+
var query = context.Blogs.Select(b => (stringValue ?? "default_value") + "_postfix");
807+
var blog_title = query.First();
808+
Assert.That(blog_title, Is.EqualTo("string_value_postfix"));
809+
810+
Console.WriteLine(query.ToString());
811+
StringAssert.AreEqualIgnoringCase("SELECT CASE WHEN ( COALESCE( @p__linq__0,E'default_value') IS NULL) THEN (E'') WHEN (@p__linq__0 IS NULL) THEN (E'default_value') ELSE (@p__linq__0) END || E'_postfix' AS \"C1\" FROM \"dbo\".\"Blogs\" AS \"Extent1\"", query.ToString());
812+
}
813+
}
814+
815+
[Test]
816+
public void TestNullPropagation_2()
817+
{
818+
using (var context = new BloggingContext(ConnectionString))
819+
{
820+
context.Database.Log = Console.Out.WriteLine;
821+
822+
context.Blogs.Add( new Blog { Name = "Hello" });
823+
context.SaveChanges();
824+
825+
string stringValue1 = "string_value1";
826+
string stringValue2 = "string_value2";
827+
string stringValue3 = "string_value3";
828+
829+
var query = context.Blogs.Select(b => (stringValue1 ?? stringValue2 ?? stringValue3) + "_postfix");
830+
var blog_title = query.First();
831+
Assert.That(blog_title, Is.EqualTo("string_value1_postfix"));
832+
833+
Console.WriteLine(query.ToString());
834+
StringAssert.AreEqualIgnoringCase("SELECT CASE WHEN ( COALESCE( @p__linq__0, COALESCE( @p__linq__1,@p__linq__2) ) IS NULL) THEN (E'') WHEN (@p__linq__0 IS NULL) THEN ( COALESCE( @p__linq__1,@p__linq__2) ) ELSE (@p__linq__0) END || E'_postfix' AS \"C1\" FROM \"dbo\".\"Blogs\" AS \"Extent1\"", query.ToString());
835+
}
836+
}
775837
}
776838
}

0 commit comments

Comments
 (0)