Open
Description
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