Skip to content

ToQueryString on a split query only shows the first query #22080

@ajcvickers

Description

@ajcvickers

For the query below, ToQueryString returns

SELECT [c].[Id]
FROM [Chunky] AS [c]
ORDER BY [c].[Id]

I would expect it to show all three queries that eventually get logged:

SELECT [c].[Id]
FROM [Chunky] AS [c]
ORDER BY [c].[Id]

SELECT [c0].[Id], [c0].[ChunkyId], [c].[Id]
FROM [Chunky] AS [c]
INNER JOIN [Cherry] AS [c0] ON [c].[Id] = [c0].[ChunkyId]
ORDER BY [c].[Id], [c0].[Id]

SELECT [m].[Id], [m].[CherryId], [c].[Id], [c0].[Id]
FROM [Chunky] AS [c]
INNER JOIN [Cherry] AS [c0] ON [c].[Id] = [c0].[ChunkyId]
INNER JOIN [Monkey] AS [m] ON [c0].[Id] = [m].[CherryId]
ORDER BY [c].[Id], [c0].[Id]

Code:

public class SomeDbContext : DbContext
{
    private static readonly ILoggerFactory
        Logger = LoggerFactory.Create(x => x.AddConsole());//.SetMinimumLevel(LogLevel.Debug));

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Chunky>();
    }
    
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder
            .UseLoggerFactory(Logger)
            .EnableSensitiveDataLogging()
            .UseSqlServer(Your.SqlServerConnectionString);
}

public static class Program
{
    public static void Main()
    {
        using (var context = new SomeDbContext())
        {
            context.Database.EnsureDeleted();
            context.Database.EnsureCreated();

            context.Add(new Chunky
            {
                Cherries = new List<Cherry>
                {
                    new Cherry
                    {
                        Monkeys = new List<Monkey> {new Monkey()}
                    }
                }
            });

            context.SaveChanges();
        }

        using (var context = new SomeDbContext())
        {
            var queryable = context.Set<Chunky>().Include(e => e.Cherries).ThenInclude(e => e.Monkeys).AsSplitQuery();
            Console.WriteLine(queryable.ToQueryString());
            queryable.ToList();
        }
    }
}

public class Chunky
{
    public int Id { get; set; }
    public ICollection<Cherry> Cherries { get; set; }
}

public class Cherry
{
    public int Id { get; set; }
    public ICollection<Monkey> Monkeys { get; set; }
}

public class Monkey
{
    public int Id { get; set; }
}

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions