Skip to content

In Pomelo 5.0.0 and later, the result int item of DefaultIfEmpty returns null instead of 0 #1994

Open
@karuakun

Description

@karuakun

I have an application that uses an older Pomelo version.
If you update your Pomelo version from 3.2.7 to 5.0.0 or higher, DefaultIfEmpty will return a different result.
Is there any way to revert to 3.2.7 results?

using System;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using Microsoft.EntityFrameworkCore;

namespace ConsoleApp2;
public class Program
{
    public static void Main()
    {
        var optionBuilder = new DbContextOptionsBuilder<MyDbContext>();
        optionBuilder.UseMySql("server=localhost;user=root;password=root;database=db", new MySqlServerVersion("8.0"));
        //optionBuilder.UseMySql("server=localhost;user=root;password=root;database=db");
        using var dbContext = new MyDbContext(optionBuilder.Options);

        var mailAddresses = (
            from user in dbContext.Users
            join mailAddress in dbContext.UserMailAddresses
                on user.Id equals mailAddress.UserId
                into tJoin
            from mailAddress in tJoin.DefaultIfEmpty()
            select new
            {
                UserId = user.Id,
                //No = (int?)mailAddress.No ?? 0,
                mailAddress.No,
                mailAddress.MailAddress,
            }
        );
        foreach (var mailAddress in mailAddresses)
        {
            Console.WriteLine($"UserId:{mailAddress.UserId}, No:{mailAddress.No}, MailAddress:{mailAddress.MailAddress}");
        }
    }
}

public class User
{
    public int Id { get; set; }
    [MaxLength(100)]
    public string Name { get; set; } = null!;
}

public class UserMailAddress
{
    public int Id { get; set; }
    public int No { get; set; }
    public int UserId { get; set; }
    [MaxLength(100)]
    public string MailAddress { get; set; } = null!;
}
public class MyDbContext(DbContextOptions<MyDbContext> options) : DbContext(options)
{
    public DbSet<User> Users => Set<User>();
    public DbSet<UserMailAddress> UserMailAddresses => Set<UserMailAddress>();
}

Pomelo 3.2.7

UserId:1, No:1, MailAddress:hoge
UserId:2, No:0, MailAddress:

Pomelo 5.0.0

UserId:1, No:1, MailAddress:hoge
Unhandled exception. System.InvalidOperationException: Nullable object must have a value.
   at lambda_method1(Closure, QueryContext, DbDataReader, ResultContext, SingleQueryResultCoordinator)
   at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.MoveNext()
   at ConsoleApp2.Program.Main() in C:\Users\***\source\repos\ConsoleApp2\ConsoleApp2\Program.cs:line 30

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions