LINQ для сущностей и оставлено внешним вопросом об объединении со многими: 1 Отношения
-
21-09-2019 - |
Вопрос
Кто -нибудь может сказать мне, почему LINQ на объекты переводят Много -1 Отношения с left outer join
вместо inner join
? Потому что есть референциальные ограничения на саму БД, которая гарантирует, что в правильной таблице есть запись, поэтому inner join
вместо этого следует использовать (и это будет работать намного быстрее)
Если отношение было Многие до 0..1 left outer join
было бы правильно.
Вопрос
Можно ли написать LINQ таким образом, чтобы он переведет в inner join
скорее, чем left outer join
. Анкет Это было бы очень ускорить выполнение запроса ... Я раньше не использовал ESQL, но было бы разумно использовать его в этом случае? Решит ли это мою проблему?
Редактировать
Я обновил свои теги, чтобы включить технологию, которую я использую в фоновом режиме:
- Организация Ontity v1
- Devart dotconnect для mysql
- База данных MySQL
Если кто -то мог бы проверить, если то же самое относится и к Microsoft SQL Server, это также дало бы мне некоторую информацию, если это проблема Деварта или это общая функциональность L2EF ... но я подозреваю, что EF является виновником здесь.
Решение
Я немного поработал над поставщиком фреймвортов и посмотрел на это. Я считаю, что у самого провайдера нет выбора в ситуации. Дерево команд создано структурой сущности и дает его поставщику для построения SQL. Это полное предположение, но, возможно, причина, по которой он генерирует левое внешнее соединение в этой ситуации, заключается в том, что структура сущности не знает, что ссылочное ограничение существует в базе данных. Например, я могу войти и смягчить с моделью объекта после того, как она создана из базы данных и добавлять/изменять ограничения, которые не имеют отражения о том, что делает база данных. Возможно, по этой причине дизайнеры решили сыграть его в безопасности и создать левое внешнее соединение «на всякий случай».
Тем не менее, я считаю, что вы можете получить внутреннее соединение. Например, следующее заставило поставщика построить левое внешнее соединение:
var res2 = from a in ent.answers
select new
{ a.Answer1, a.user.UserName };
Однако следующее приводит к внутреннему соединению:
res2 = from a in ent.answers
join u in ent.users
on a.UserID equals u.PK
select new { a.Answer1, u.UserName };
Кроме того, следующая сущность SQL создала внутреннее соединение:
ObjectQuery<DbDataRecord> dr = ent.CreateQuery<DbDataRecord>(
"SELECT a.answer1, u.username " +
"FROM answers as a inner join users as u on a.userid = u.pk" );