Дополнительное объединение в запросе для объектов значения в Entity Framework Core - PullRequest
1 голос
/ 06 апреля 2020

В Entity Framework Core 3.1.3 я использовал функцию объекта-значения. Что касается запроса, проблема в том, что в T- SQL существует дополнительное левое соединение. Это дополнительное соединение приводит к проблемам с точки зрения производительности. В следующем коде Student является типом Entity, а Address address является типом значения .

Entities

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Address Address { get; set; }
}

public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }
}

DbContext

public class ApplicationDbContext : DbContext
{
    public DbSet<Student> Students { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Student>().OwnsOne(e => e.Address);
        base.OnModelCreating(builder);
    }
}

Entity Каркасный запрос

var list = _dbContext.Students.ToList();

Сгенерированный T- SQL для этого запроса EF:

SELECT [s].[Id], [s].[Name], [t].[Id], [t].[Address_City], 
       [t].[Address_Street], [t].[Address_ZipCode]
FROM [Students] AS [s]
LEFT JOIN (
    SELECT [s0].[Id], [s0].[Address_City], 
           [s0].[Address_Street], [s0].[Address_ZipCode]
    FROM [Students] AS [s0]
    WHERE [s0].[Address_ZipCode] IS NOT NULL OR 
          ([s0].[Address_Street] IS NOT NULL OR 
          [s0].[Address_City] IS NOT NULL)
) AS [t] ON [s].[Id] = [t].[Id]

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Эта ошибка появилась в новом конвейере обработки запросов EF Core 3.0, скорее всего, связана со следующим критическим изменением Зависимые сущности, совместно использующие таблицу с принципалом, теперь являются необязательными , что должно исправить некоторых пользователей. запрошенный сценарий ios, но на самом деле нарушает многие другие.

В настоящее время он отслеживается # 18299: запрос на принадлежащий объект производит слишком сложный SQL и, к сожалению, похоже, не будет исправлено в версии 3.1, поэтому ожидается, что люди будут ждать релиз 5.0. Между тем с этим ничего не поделаешь.

0 голосов
/ 06 апреля 2020

Вы упомянули отношение как "принадлежащий" тип. Тип собственности всегда включается при запросе родительского объекта. Подробнее см. здесь .

Вы можете использовать отношение HasOne, чтобы избежать этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...