Ef core создает подзапрос вместо объединения в фильтрах запросов или TPH

У меня есть сущность, настроенная так, чтобы ее всегда запрашивали со свойством «DELETED» = «N». В EF 6 я мог бы сделать:

modelBuilder.Entity<MyEntity>().Map(m => m.Requires("DELETED").HasValue("N"))

SELECT `n`.`id`. FROM `OtherEntity` AS `n` LEFT JOIN `MyEntity` as `e` ON (`e`.`DELETED`='N') AND (`e`.ID = `n`.ID)

и ORM автоматически добавит AND (DELETED = 'N') ко всем соединениям. Если я попытаюсь использовать фильтры запросов или наследование таблицы для каждой иерархии в Entity Framework Core, возникнет проблема — все соединенные таблицы будут преобразованы в подзапросы. Это убивает мою производительность.

modelBuilder.Entity<BaseEntity>().HasDiscriminator(e => e.Deleted) .HasValue<MyEntity>("N");

SELECT `n`.`id`.
FROM `OtherEntity` AS `n` 
LEFT JOIN (
    SELECT `n.Ent`.*
    FROM `MyEntity` AS `n.Ent`
    WHERE `n.Ent`.`DELETED` = 'N'
) AS `t` ON `n`.`ID` = `t`.`ID`

Есть ли способ улучшить этот sql? Может быть, сторонний провайдер может это исправить?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
296
1

Ответы 1

Мы не можем воспроизвести проблему в нашей среде. Отправьте нам небольшой тестовый проект с соответствующим DDL-скриптом через https://www.devart.com/company/contactform.html.

Извините за неточность. Я попробовал официального провайдера Oracle и пометил devart, потому что хотел посмотреть, справится ли ваш драйвер с этим лучше, чем по умолчанию.

Shadow 07.02.2019 18:06

Значит, этого не должно быть? Потому что у меня такая же проблема

M364M4N cro 06.08.2020 09:17

Другие вопросы по теме