Кто-то может сказать мне, почему делает Linq к Объектам, переводят многих в 1 отношение к left outer join
вместо inner join
? Поскольку существует ограничение по внешнему ключу на сам DB, который гарантирует, что существует запись в правильной таблице, таким образом, inner join
должен использоваться вместо этого (и это работало бы намного быстрее),
Если отношение было многими к 0.. 1 left outer join
было бы корректно.
Действительно ли возможно записать LINQ способом, таким образом, это переведет в inner join
вместо left outer join
. Это ускорило бы выполнение запросов много... Я не использовал eSQL прежде, но было бы мудро использовать его в этом случае? Это решило бы мою проблему?
Я обновил свои теги для включения технологии, которую я использую в фоновом режиме:
Если кто-то мог бы протестировать, если бы то же верно на Microsoft SQL server, это также дало бы мне некоторое понимание, если это - проблема Devart, или это - общая функциональность L2EF... Но я подозреваю, что EF является преступником здесь.
Я немного поработал над поставщиком фреймворка сущности и посмотрел на него. Я считаю, что у самого провайдера нет выбора в сложившейся ситуации. Дерево команд создается структурой сущностей и передает его поставщику для построения 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" );