Skip to content

SqlServer never returns null for nullable Boolean expressions #34001

Open

Description

The SqlServer provider never returns null for bool? expressions; instead it returns false.

An example program that showcases the bug is:

using System;
using System.Data;
using System.Linq;
using Microsoft.EntityFrameworkCore;

using var db = new BloggingContext();

var qs = db.Blogs
	.Select(x => x.NullableInt > 0)
    .ToQueryString();

Console.WriteLine(qs);

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options
            .LogTo(Console.WriteLine, Microsoft.Extensions.Logging.LogLevel.Information)
            .UseSqlServer();

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
		modelBuilder.Entity<Blog>().HasData(new Blog { BlogId = 1, NullableInt = 0 });
		modelBuilder.Entity<Blog>().HasData(new Blog { BlogId = 2, NullableInt = 1 });
		modelBuilder.Entity<Blog>().HasData(new Blog { BlogId = 3, NullableInt = null });
    }
}

public class Blog
{
    public int BlogId { get; set; }
	public int? NullableInt { get; set; }
}

The query is translated to

SELECT CASE
    WHEN [b].[NullableInt] > 0 THEN CAST(1 AS bit)
    ELSE CAST(0 AS bit)
END
FROM [Blogs] AS [b]

hence the result of the SELECT can only be 0 or 1 (this also happens by actually performing the query; in that case it obviously requires a running instance of SqlServer).

Include provider and version information

EF Core version: 8.0.6
Database provider: Microsoft.EntityFrameworkCore.SqlServer
Target framework: .NET 8.0
Operating system: Linux (/WSL)
IDE: Visual Studio Code 1.89.1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions