Linq к Объектам и ОСТАВЛЕННОМУ ВНЕШНЕМУ ОБЪЕДИНЕНИЮ выходят с отношениями MANY:1

Кто-то может сказать мне, почему делает Linq к Объектам, переводят многих в 1 отношение к left outer join вместо inner join? Поскольку существует ограничение по внешнему ключу на сам DB, который гарантирует, что существует запись в правильной таблице, таким образом, inner join должен использоваться вместо этого (и это работало бы намного быстрее),

Если отношение было многими к 0.. 1 left outer join было бы корректно.

Вопрос

Действительно ли возможно записать LINQ способом, таким образом, это переведет в inner join вместо left outer join. Это ускорило бы выполнение запросов много... Я не использовал eSQL прежде, но было бы мудро использовать его в этом случае? Это решило бы мою проблему?

Править

Я обновил свои теги для включения технологии, которую я использую в фоновом режиме:

  • Платформа объекта V1
  • Devart dotConnect для Mysql
  • База данных MySql

Если кто-то мог бы протестировать, если бы то же верно на Microsoft SQL server, это также дало бы мне некоторое понимание, если это - проблема Devart, или это - общая функциональность L2EF... Но я подозреваю, что EF является преступником здесь.

7
задан Robert Koritnik 23 March 2010 в 22:52
поделиться

1 ответ

Я немного поработал над поставщиком фреймворка сущности и посмотрел на него. Я считаю, что у самого провайдера нет выбора в сложившейся ситуации. Дерево команд создается структурой сущностей и передает его поставщику для построения SQL. Это полное предположение, но, возможно, причина, по которой он генерирует соединение LEFT OUTER в этой ситуации, заключается в том, что инфраструктура сущностей не знает, что в базе данных существует ссылочное ограничение.Например, я могу зайти и испортить модель сущности после того, как она будет создана из базы данных, и добавить / изменить ограничения, которые не отражаются на том, что делает база данных. Возможно, по этой причине дизайнеры решили перестраховаться и изготовили ЛЕВОЕ ВНЕШНЕЕ соединение «на всякий случай».

Тем не менее, я считаю, что вы можете получить внутреннее соединение. Например, следующее заставило провайдер построить соединение LEFT OUTER:

var res2 = from a in ent.answers
           select new
           { a.Answer1, a.user.UserName };

Однако следующие результаты в соединении INNER:

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" );
2
ответ дан 7 December 2019 в 18:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: