Entity Framework Core es carga lenta cuando se transforma

Tengo un problema con Entity Framework Core (v2.0.1) al transformar un modelo de entidad en un DTO. Básicamente es, por cualquier otra versión de la frase, carga lenta cuando no lo quiero. Aquí hay una aplicación simple .NET Core Console (con el paquete Microsoft.EntityFrameworkCore.SqlServer (2.0.1)).

using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;

namespace EfCoreIssue
{
    class Program
    {
        static void Main(string[] args)
        {
            var dbOptions = new DbContextOptionsBuilder<ReportDbContext>()
                .UseSqlServer("Server=.;Database=EfCoreIssue;Trusted_Connection=True;")
                .Options;

            // Create and seed database if it doesn't already exist.
            using (var dbContext = new ReportDbContext(dbOptions))
            {
                if (dbContext.Database.EnsureCreated())
                {
                    string alphas = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

                    foreach (char alpha in alphas)
                    {
                        var report = new Report { Title = $"Report { alpha }" };

                        for (int tagId = 0; tagId < 10; tagId++)
                            report.Tags.Add(new ReportTag { TagId = tagId });

                        dbContext.Reports.Add(report);
                        dbContext.SaveChanges();
                    }
                }
            }

            using (var dbContext = new ReportDbContext(dbOptions))
            {
                var reports = dbContext.Reports
                    .Select(r => new ReportDto
                    {
                        Id = r.Id,
                        Title = r.Title,
                        Tags = r.Tags.Select(rt => rt.TagId)
                    })
                    .ToList();
            }
        }
    }

    class ReportDbContext : DbContext
    {
        public DbSet<Report> Reports { get; set; }

        public ReportDbContext(DbContextOptions<ReportDbContext> options)
            : base(options) { }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<ReportTag>().HasKey(rt => new { rt.ReportId, rt.TagId });
        }
    }

    [Table("Report")]
    class Report
    {
        [Key]
        public int Id { get; set; }
        public string Title { get; set; }
        public virtual ICollection<ReportTag> Tags { get; set; }

        public Report()
        {
            Tags = new HashSet<ReportTag>();
        }
    }

    [Table("ReportTag")]
    class ReportTag
    {
        public int ReportId { get; set; }
        public int TagId { get; set; }
    }

    class ReportDto
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public IEnumerable<int> Tags { get; set; }
    }
}

Ahora cuando elToList() El método se ejecuta para recuperar los datos, está ejecutando el siguiente SQL

SELECT [r].[Id], [r].[Title]
FROM [Report] AS [r]

Como puede ver, no ha hecho ningún esfuerzo para unirse a la[ReportTag] tabla, y si realmente intenta leer los valores deTags propiedad en unReportDto luego dispara otra consulta SQL

SELECT [rt].[TagId]
FROM [ReportTag] AS [rt]
WHERE @_outer_Id = [rt].[ReportId]

Ahora sé que EF Core no admite la carga diferida, pero esto se parece mucho a la carga diferida para mí. En este caso, no quiero que la carga sea lenta. He intentado cambiarvar reports = dbContext.Reports avar reports = dbContext.Reports.Include(r => r.Tags) que no tiene efecto

Incluso he intentado cambiarTags = r.Tags.Select(rt => rt.TagId) aTags = r.Tags.Select(rt => rt.TagId).ToList() pero eso solo dispara la consulta SQL secundaria anterior 26 veces más.

Finalmente en la desesperación intenté cambiarvar reports = dbContext.Reports avar reports = dbContext.Reports.Include(r => r.Tags).ThenInclude((ReportTag rt) => rt.TagId) pero eso comprensiblemente arroja una excepción queReportTag.TagId No es una propiedad de navegación.

¿Alguien tiene alguna idea sobre lo que puedo hacer para que se cargue con entusiasmo en elReportDto.Tags ¿propiedad?

Respuestas a la pregunta(1)

Su respuesta a la pregunta