LINQ для сущностей и оставлено внешним вопросом об объединении со многими: 1 Отношения

StackOverflow https://stackoverflow.com/questions/2490919

Вопрос

Кто -нибудь может сказать мне, почему 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" );
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top